python:错误、异常处理机制
为什么要异常处理机制:
【1】在程序调用层数较深时,向主调函数传递错误信息需要层层return
【2】返回比较麻烦,用异常处理机制可以较简单的传送错误信息
1、错误
错误是指由于逻辑或语法等错误导致一个程序已无法正常执行的问题。
语法错误:代码不符合解释器或者编译器语法,例如 缩进字符、循环语句的冒号
逻辑错误:不完整或不合法输入、算法问题,比如0作除数
2、异常
【1】异常是程序出错时标识的一种状态 当异常发生时,程序不会再向下执行,而转去调用此函数的地方待处理此错误并恢复为正常状态。
【2】程序遇到逻辑或者算法问题
【3】运行过程中计算机错误(内存不够或IO错误)
这两个或抛出异常,如果没有手动对其进行处理,那么此异常就会被解释器捕获,处理的方法
为忽略或者终止程序
3、错误和异常的区别
错误是代码运行前
错误是非正常的,不应该出现的,比如:缩进、循环语句的冒号
异常是由错误产生的
异常是代码运行时产生的 ,解释器检测到错误并且认为是异常,抛出异常
如果不捕获处理可能会终止程序
我们可以在代码中主动捕获异常并处理
4、异常的作用
用作信号,通知上层调用者有错误产生需要处理
5、异常处理
5.1 try...except 语句捕获异常
try...except的工作原理:
except子句可以有多个,处理不同的特定异常,但是except最多只有一个被执行。
一个except子句处理多个异常时,将这些异常放在一个括号中形成一个元组。例如:
except (xxxError,yyyError,dddError):
pass
最后一个except子句可以忽略异常名称,此时的 : 将被当做通配符使用。可以使用这种方法打印一个错误信息,然后再次把异常抛出
except:
print("Unexpected error:", sys.exc_info())
raise
1)首先,执行try子句,关键字try和关键字except之间的语句
2)如果没有异常发生,忽略except子句,try子句执行完后,结束
3)如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。
4)如果发生的异常类型和except之后的名称相符,那么对应的except子句就会被执行
5)如果发生的异常没有一个与except 类型相符,那么这个异常将传递给上层的try中
5.2 try...except ...else捕获处理异常
else子句可选,如果有else子句,那么必须放在所有的except子句之后。else子句将在try子句没有发生任何异常的时候执行。
5.3 try...finally 语句
语句无论是否发生异常都将执行最后的代码。
6、主动触发异常
raise语句 触发异常
触发一个错误,让程序进入异常状态
语法:
raise 异常类型
raise 异常对象
In [1]: def make_exception(): ...: print("函数开始") ...: # 发出一个ValueError类型的错误通知给调用者 ...: # raise ValueError ...: err = ValueError("这是自定义的错误数据") ...: raise err # 用 err触发一个异常通知 ...: print("函数结束") #不会执行,前面主动触发了异常 ...: ...: ...: try: ...: make_exception() ...: print("make_exception调用结束!") #不会执行,因为make_exception函数出现了错误,调用失败 ...: except ValueError as e: ...: print("接收到ValueError类型的异常通知") ...: print("错误对象是:", e) ...: 函数开始 接收到ValueError类型的异常通知 错误对象是: 这是自定义的错误数据
7、assert 语句
断言语句
assert 真值表达式,错误数据(通常是字符串)
当真值表达式为False时,用错误数据创建一个AssertionError类型错误,并进入异常状态
等同于 :
if 真值表达式==False:
raise AssertionError(错误数据)
In [2]: def get_score(): ...: s = int(input("请输入学生成绩: ")) ...: assert 0 <= s <= 100, '成绩超出范围' ...: # if not (0 <= s <= 100): ...: # raise AssertionError('成绩超出范围') ...: return s ...: ...: ...: try: ...: score = get_score() ...: except AssertionError as err: ...: print("错误数据是:", err) ...: print('获取成绩失败') ...: score = 0 ...: ...: print("学生的成绩为:", score) 请输入学生成绩: 101 错误数据是: 成绩超出范围 获取成绩失败 学生的成绩为: 0
8、异常总结
异常处理语句(四条):
try-except 语句: 用于接收异常通知,捕获异常
try-finally 语句: 执行必须要执行的语句
raise 语句 发送异常知通,并进入异常状态
assert 语句 根据条件选择性的发送AssertionError类型的异常通知