写代码的时候,我们都会遇到需要人工处理的‘错误’,这些错误不是不小心造成的bug,而是我们知道可能有雷但不得不去走一遍的雷区,捕获异常就是排雷。
对于系统停止执行并抛出的异常我们称为抛出raise
,我们要做的就是捕获异常,以保证程序的稳定性和健壮性。
一般有以下几个操作:
try:
代码...
except:
if 出现异常
处理代码...
...
else:
没有异常
后续处理
finally:
不管有没有异常
都会执行的代码...
示例:
a = 'xxx'
try:
print(a)
except Exception as e:
print(e)
else:
print('无异常')
finally:
print('不管有无异常,finally都会执行')
try的嵌套
意思就是try中有try
a = 1
try:
b=0/a
try:
c = 3/b
except Exception as e:
print(e)
except Exception as e:
print(e)
else:
print('代码没有异常')
附上执行结果:
float division by zero # 内部抛出的异常
代码没有异常 # 外部执行结果
当内部异常抛出后,程序恢复正常,继续往下执行,此时程序是正确的无异常的,所以在下一步无异常的情况下,程序外部再无捕获异常,执行else结果。
异常的传递
函数/方法执行出现异常,会将异常传递给函数/方法的调用一方。
# 错误代码
def a():
print('a执行')
1/0
print('a结束')
def b():
print('b执行')
a()
print('b结束')
def c():
print('c执行')
b()
print('c结束')
c()
# 这段代码的函数会全部执行,但只会执行第一步,开始调用其它函数时,就会开始报错。
解决方式,在最外层的函数或者说主函数做抛出异常处理。
def a():
print('a执行')
1/0
print('a结束')
def b():
print('b执行')
a()
print('b结束')
def c():
print('c执行')
try:
b()
except Exception as e:
print(e)
print('c结束')
c()
也可所有的类都抛出异常
Exception
所有异常的父类
class MinGanCi(Exception):
def __str__(self):
return '[ERROR]您发布了不宜公开的内容:已被和谐'
try:
info = input('请输入要发布的微博内容')
if info in ['暴力','蛤','清君侧']:
raise MinGanCi()
except MinGanCi as e:
print(e)
处理是否抛出异常问题
class A:
def __init__(self,flag):
self.flag = flag
def myError(self):
try:
1/0
except Exception as e:
if self.flag:
print(e)
else:
raise
a=A(1)
a.myError()
a=A(0)
a.myError()
# 根据输入1或0,决定是否抛出