试一试看:
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
在达到raise
之前引发了一个新错误,因此except子句中的raise
从未执行,只有道歉的错误向上传播。如果apologize
引发错误,则Python无法知道您将在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
子句捕获的异常。原始异常在回溯中提到,但被后面的异常所包含,并且不能再次被捕获。
print('do_something_dangerous raised {!r}'.format(e))
至少查看并了解正在发生什么。 - abarnertexcept Exception
,而不是裸的except:
。部分原因是为了让他能够使用except Exception, e:
捕获异常(尽管这是一个旧博客,所以它使用旧语法;你应该使用except Exception as e:
),另一部分原因是避免捕获像KeyboardInterrupt
这样的东西,你很少想要处理它们。(当你需要处理时,请使用except BaseException:
显式地处理。在旧版本的 Python 中,这不是一个选项,但假设你正在编写例如 2.6 或 3.0 的版本,那么它就是。) - abarnert