def foo(s):
try:
n = int(s)
r=10/n
except ZeroDivisionError as e:
raise FooError(e) from ZeroDivisionError
输出:
ZeroDivisionError #标出原始异常
The above exception was the direct cause of the following exception: #上述异常直接导致了如下异常
Traceback (most recent call last):
File "<pyshell#77>", line 1, in <module>
foo(0)
File "<pyshell#76>", line 6, in foo
raise FooError(e) from ZeroDivisionError
FooError: division by zero
一盒噪噪
关于raise: 抛出①当前异常 ②后跟异常 给上级调用者 (即使当前异常和后跟异常是相同的,也会抛出两个)
(当引发异常,当前异常/最后一个异常会自动存储在异常类的__cause__变量中,raise语句会抛出这个变量)
解决方法是调用下面的语句,把当前异常赋值给raise后的语句
# new_exc 自定义异常
# original_exc 原始异常
例:
输出:
注意:
你可以直接写:
这是python3新改的语法: raise MyException('error message') # 括号里是异常原因
在python2中是这样的:raise MyException,'error message'
所以FooError(e) 并不是调用FooEorror类的意思
异常原因可以有多个,在输出异常的时候会依次打印,并且如果有两个及以上的话,会附带上异常名称(基类)
如下:
输出:(对比一下上面的异常,一目了然)
谁导致了异常:
输出:
ps:异常对象无法在异常块作用域外访问