异常
- 就是错误
- 异常会导致程序崩溃并停止运行
- 异常处理:能监控并捕获到异常,对异常部位进行处理,使程序可以继续正常运行
例:
a = 1 / 0
print(a)
结果:抛出异常ZeroDivisionError,表示除数不能为0
语法:
try:
<代码块1> # 检查并被保护的业务代码
except <异常类型>:
<代码块2> # 代码块1出现错误后执行的代码
注:
- try语句中发现错误后就开始进入异常处理,try中的错误语句后面的代码不会再执行了
捕获通用异常:无法确认是哪种异常时使用
用法:
try:
<代码块>
except Exception as e:
<异常代码块>
例:
try:
a = 1 / 0
# 上面的语句出现异常后,这个打印语句不会再执行了
print('hello')
except Exception as e:
# e是打印具体的异常信息
print(f'出现异常:{e}')
结果:
捕获具体异常:确认是哪种异常时使用
用法:
try:
<代码块>
except <具体异常类型> as e:
<异常代码块>
例1:出现的异常与捕获异常相符
try:
a = 1 / 0
except ZeroDivisionError as e:
print('出现异常:除数不能为0')
结果:出现的异常与捕获的异常相符,会执行except中的语句
例2:出现的异常与捕获异常不符
try:
# 这里会报错,字符串不能和数字相加
a = '13' + 1
# 这里不会的是除数不能为0的异常
except ZeroDivisionError as e:
print('出现异常:除数不能为0')
结果:捕获的异常与发送的异常不符时,会直接报错
捕获多个异常:
- 捕获多个异常时,当捕获到第一个异常后,不会继续往下捕获
方式一:可以有多个except
try:
<代码块>
except <具体异常类型> as e:
<异常代码块>
except Exception as e:
<异常代码块>
方式二:使用元组将异常类型包裹起来,,捕获到哪个抛哪种
try:
<代码块>
except (具体异常类型,Exception) as e:
<异常代码块>
例1:
try:
a = '1' + 1
except ZeroDivisionError as e:
print('出现异常:除数不能为0')
except TypeError as e:
print('出现异常:数据类型错误')
结果:
例2:
try:
a = '1' + 1
except (ZeroDivisionError, TypeError) as e:
print(f'出现异常:{e}')
结果:
常见异常类型
finally
- 无论是否发生异常,finally中的语句一定会执行
- 在函数中,即使在try或者except中进行了return仍然会执行finally
- try语法至少要含有except或finally中一个
- 若是try和finally或者except和finally中同时触发return语句,最后实际返回的是finally中return的值
语法:
try:
<代码块1> # 业务代码
except:
<代码块2> # 发生异常后执行的代码
finally:
<代码块3> # 不论是否发异常都会执行的代码
注:
- 在Python2.5之前的版本,finally是独立使用,不能与try一起,之后的版本才变成可以和try一起
例1:没有异常
def test():
try:
a = 1 + 1
print('没有异常呢')
return 'try'
except TypeError as e:
print('出现异常:数据类型错误')
finally:
print('无论是否有异常,一定会执行')
return 'finally'
print(f'打印:{test()}')
结果:
例2:有异常
def test():
try:
a = '1' + 1
except TypeError as e:
print('出现异常:数据类型错误')
return '出现异常'
finally:
print('无论是否有异常,一定会执行')
# 无论try和except是否有return,最终返回的一定时finally中的return
return 'finally'
print(f'打印:{test()}')
结果: