试试看:
def failure():
raise ValueError, "Real error"
def apologize():
raise TypeError, "Apology error"
try:
failure()
except ValueError:
apologize()
raise
结果:
Traceback (most recent call last):
File "<pyshell#14>", line 10, in <module>
apologize()
File "<pyshell#14>", line 5, in apologize
raise TypeError, "Apology error"
TypeError: Apology error
原因:来自原始函数的“真正”错误已经被except
. 在到达之前apologize
引发一个新错误。因此,in子句永远不会执行,只有道歉的错误会向上传播。如果引发错误,Python 无法知道您将在.raise
raise
except
apologize
apologize
请注意,在 Python 3 中,回溯将提及这两个异常,并带有一条消息,解释第二个异常是如何产生的:
Traceback (most recent call last):
File "./prog.py", line 9, in <module>
File "./prog.py", line 2, in failure
ValueError: Real error
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "./prog.py", line 11, in <module>
File "./prog.py", line 5, in apologize
TypeError: Apology error
但是,第二个异常(“道歉”异常)仍然是唯一向外传播的异常,并且可以被更高级别的except
子句捕获。回溯中提到了原始异常,但包含在后面的异常中,无法再被捕获。