1.接上一篇<<解锁python异常----上>>
2.捕获对象
我们可以先看一下不捕获异常对象时的报错。这里报出了异常类及异常对象(可以理解为出现异常的原因)
c = 9
c /= 0
# Traceback (most recent call last):
# File <string>, line 8, in <module>
# c /= 0
# ZeroDivisionError: division by zero
捕获异常对象,这里需要两个参数,第二个参数将关联到异常对象,从输出可以看出,发生异常并没有中断流程,只是记录下了错误。
c = 9
try:
c /= 0
except ZeroDivisionError as e:
print(e)
print(c)
# division by zero
# 9
3.对不同的异常采取不同的措施
将多个异常类放入同一个元组中
c = 9
try:
c /= 'a'
except (ZeroDivisionError, TypeError) as e:
print(e)
print(c)
# unsupported operand type(s) for /=: 'int' and 'str'
c = 9
try:
c /= 0
except (ZeroDivisionError, TypeError) as e:
print(e)
# division by zero
使用多个except子句也可以达到同样的效果
c = 9
try:
c /= 'a'
except ZeroDivisionError as e:
print(e)
except TypeError as e:
print(e)
# unsupported operand type(s) for /=: 'int' and 'str'
有时候我们处理了一些异常,但仍然可能有遗漏的异常,那么可以只使用try/except语句
c = 9
try:
c /= 0
except:
print('Error!!!')
# Error!!!
4.else子句和finally子句
else语句在主try块没有引发异常时执行
c = 9
try:
c /= 3
except (ZeroDivisionError, TypeError) as e:
print('Error!!!')
else:
c += 2
print(c)
# 5.0
finally子句确保代码块无论是否引发异常都将执行
c = 9
try:
c /= 0
except (ZeroDivisionError, TypeError) as e:
print('Error!!!')
finally:
c /= 3
print(c)
# Error!!!
# 3.0
# 这里异常,但还是执行了finally子句中的。
5.异常和函数
异常和函数有着天然的联系。如果不处理函数引发的异常,它将向上传播到调用函数的地方。如果在哪里也未得到处理,异常将继续传播,直至达到主程序(全局作用域)。
6.异常之蝉
异常处理并不是很复杂。如果你知道代码可能引发某种异常,且不希望出现这种异常时程序终止并显示栈跟踪信息,可添加必要的try/except或try/finally语句来处理它