文章目录
异常机制
当程序出现异常,程序安全的退出、处理完后继续执行的机制。python中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法。下面较为完整的展示了python中内建异常类的继承层次:
python中一切都是对象,异常也采用对象的方式来处理。处理过程:
1 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给解释器。
2 捕获异常:解释器得到该异常后,寻找相应的代码来处理该异常
解决异常问题的态度
1 学习完异常相关知识点,只是开始对异常有些认识,不意味着你会调试任何异常;
2 调试异常,需要大量的经验作为基础。因此,大家不要在此停留,继续往后学习。碰到每个异常,都要花心思去解决而不要动不动张口问人。通过自己的努力无法解决,再去找他人帮助解决。
解决每一个遇到的异常,建议大家遵循如下三点:
1 不慌张,细看信息,定位错误。看清楚报的错误信息,并定位发生错误的地方。
2 百度并查看十个相关帖子。将异常类信息进行百度,至少查看十个以上的相关帖子。
3 以上两步仍然无法解决,找老师和同学协助解决。
异常解决的关键:定位
当发生异常时,解释器会报相关的错误信息,并会在控制台打印出 相关错误信息。我们只需按照从上到下的顺序即可追溯(Trackback)错误发生的过程,最终定位引起错误的那一行代码。
try和except结构
try...
一个except
结构
try...except
是最常见的异常处理结构。结构如下:
try:
被监控的可能引发异常的语句块
except BaseException [as e]:
异常处理语句块
1 try
块包含着可能引发异常的代码, except
块则用来捕捉和处 理发生的异常。
2 执行的时候,如果try
块中没有引发异常,则跳过ecept
块继续执行后续代码;
3 执行的时候,如果try
块中发生了异常,则跳过try
块中的后续代码,跳到相应的except
块中处理异常;异常处理完后,继续执行后续代码。
示例
try:
print("step1")
a = 3/0
print("step2")
except BaseException as e:
print("step3")
print(e)
print("step4")
输出结果
step1
step3
division by zero
step4
上述结果表明跳过了step2这个步骤,直接处理异常。
try…多个except结构
上面的结构可以捕获所有的异常,工作中也很常见。但是,从经典理论考虑,一般建议尽量捕获可能出现的多个异常(按照先子类后父类的顺序),并且针对性的写出异常处理代码。为了避免遗漏可能出现的异常,可以在最后增加BaseException
。结构如下:
try:
被监控的、可能引发异常的语句块
except Exception1:
处理Exception1的语句块
except Exception2:
处理Exception2的语句块
[...]
except BaseException:
处理可能遗漏的异常的语句块
示例
try:
a = input("请输入被除数:")
b = input("请输入除数:")
c = float(a)/float(b)
print(c)
except ZeroDivisionError:
print("异常:除数不能为0")
except TypeError:
print("异常:除数和被除数都应该为数值类型")
except BaseException as e:
print(e)
print(type(e))
请输入被除数:AA
请输入除数:0
could not convert string to float: ‘AA’
<class ‘ValueError’>
try…except…else结构
try...except...else
结构增加了else
块。如果try
块中没有抛出异常,则执行else
块。如果try
块中抛出异常,则执行except
块,不执行else
块。
示例
try:
a = input("请输入被除数:")
b = input("请输入除数:")
c = float(a)/float(b)
except BaseException as e:
print(e)
else:
print("除的结果是:",c)
结果1
请输入被除数:1
请输入除数:0
float division by zero
结果2
请输入被除数:2
请输入除数:1
除的结果是: 2.0
try…except…finally结构
try...except...finally
结构中, finally
块无论是否发生异常都会被执行;通常用来释放try
块中申请的资源
示例
try:
a = input("请输入一个被除数:")
b = input("请输入一个除数:")
c = float(a)/float(b)
except BaseException as e:
print(e)
else:
print(c)
finally:
print("我是finally中的语句,无论发生异常与否,都执行!")
print("程序结束!")
请输入一个被除数:1
请输入一个除数:0
float division by zero
我是finally中的语句,无论发生异常与否,都执行!
程序结束!