错误和异常

错误 error:

错误是指由于逻辑或语法等导致一个程序无法正常运行的问题

异常 exception:

异常是指程序出错时标识的一种状态

当异常发生时,程序不会再向下执行,而转向调用此函数的地方待处理此错误并恢复为正常状态

作用:

    用作信号,通知上层调用者有错误产生需要处理

try 语句:

try … except 语句:

        语法:

            try:
                可能触发异常的语句
            except 错误类型1 [as 变量1]:
                异常处理语句1
            except 错误类型2 [as 变量2]:
                异常处理语句2
            except (错误类型3,错误类型4):
                异常处理语句3
            ...
            except:
                异常处理语句other
            else:
                未发生异常的语句
            finally:
                最终语句

        说明:

            as 子句是用于绑定错误对象的变量,可以省略

            except 子句可以有一个或多个,至少有一个

            else 子句最多只能有一个,也可以省略

            finally 子句最多只能有一个,也可以省略

        作用:

            尝试捕获异常(接收异常通知),将程序转为正常状态并继续执行

        示例:

            


def div_apple(n):
    print("%d个苹果你想分给几个人?" % n)
    s = input("请输入人数:")
    # 可能触发ValueError错误进入异常
    cnt = int(s)
    # 可能触发ZeroDivisonError错误
    result = n / cnt
    print("每个人分了", result, "个苹果")


try:
    div_apple(10)
    print("苹果分完了!")
# except ValueError:
#     print("在try内部语句中发生了值错误,已处理并转为正常状态.")
# except ZeroDivisionError:
#     print("输入人数为零,分苹果失败.")
except (ValueError, ZeroDivisionError):
    print("分苹果失败!")

print("程序正常退出")

try … finally 语句:

        语法:

            try:
                可能触发异常的语句
            finally:
                最终语句

        说明:

            finally子句不可以省略

            一定不存在except子句

        作用:

            通常用try-finally语句来做触发异常时必须要处理的事情,无论异常是否发生,finally子句都会执行

            try-finally语句不会改变程序的(正常/异常状态)

        示例:

            # try_finally.py


def fry_egg():
    print("打开天然气...")
    try:
        count = int(input("输入鸡蛋个数:"))
        print("完成煎鸡蛋,共煎了%d个鸡蛋!" % count)
    finally:
        print("关闭天然气")


try:
    fry_egg()
except:
    print("程序出现过异常,已转为正常状态")

print("程序正常退出")

try 语句嵌套:

    try嵌套是指一个try语句嵌套在另一个try语句中

    示例:
    try:
	    try:
	        n = int(input("输入整数:"))
	    except ValueError:
	        print("在内层try语句中出现值错误,已转为正常状态.")
	    else:
	        print("内层try语句没有出现异常.")
	except:
	    print("外层的try语句接收到的异常通知,已处理并转为正常状态.")
	else:
	    print("外层try语句没有出现异常.")

raise 语句:

    作用:

        触发一个错误,让程序进入异常状态,发送错误通知给调用者

    语法:

        raise 异常类型

        或

        raise 异常对象

        或

        raise # 重新触发上一次异常

    示例:

       # raise.py


	def make_except():
	    print("开始")
	    # 故意发送一个错误通知
	    # raise ValueError
	    e = ValueError("这是故意制作的一个错误!")
	    raise e
	    print("结束")
	
	
	try:
	    make_except()
	except ValueError as e:
	    print(e)
	    print("make_except发出了ValueError类型的错误,已捕获.")
	
	
	print("程序结束")

assert 语句(断言语句):

   语法:

       assert 真值表达式,错误数据(通常是字符串)

   作用:

       当真值表达式为False时,用错误数据创建一个AssertionError类型的错误raise出去
       ,并进入异常状态.等同于:

           if 真值表达式 == False:
               raise AssertionError(错误数据)

        示例:

# 此示例示意assert语句的用法
def get_score():
    s = int(input("输入学生成绩(0~100):"))
    assert 0 <= s <= 100, "成绩超出范围!"
    # 等同于:
    # if (0 <= s <= 100) is False:
    #     raise AssertionError("成绩超出范围!")
    return s


try:
    score = get_score()
except ValueError:
    print("用户输入的数字不能转为整数!")
except AssertionError:
    print("用户输入的数字不在范围内!")
else:
    print("学生成绩为:", score)

为什么要用异常处理机制:

在程序调用层数较深时,向主调函数传递错误信息需要层层return返回比较麻烦,所以用异常处理机制

猜你喜欢

转载自blog.csdn.net/weixin_43929852/article/details/85165824
今日推荐