重新抛出python异常。要抓哪个?

时间:2014-07-28 18:36:31

标签: python exception throw rethrow

我正在学习使用python。我刚看到这篇文章: http://nedbatchelder.com/blog/200711/rethrowing_exceptions_in_python.html 它描述了在python中重新抛出异常,如下所示:

try:
    do_something_dangerous()
except:
    do_something_to_apologize()
    raise

由于您重新抛出异常,因此应该是"外部捕获 - 除了"声明。但现在,我在想。如果except中的do_something_to_apologize()抛出错误怎么办?哪一个将被捕获在外部" catch-except"?你重新抛出的那个还是do_something_to_apologize()抛出的那个? 或者首先捕获具有最高暴力的例外?

2 个答案:

答案 0 :(得分:44)

试一试,看看:

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 之前引发新错误。因此,raise子句中的except永远不会执行,只有道歉的错误向上传播。如果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子句捕获的异常。 回溯中提到了原始异常,但是后面的异常被包含在内,并且不再被捕获。

答案 1 :(得分:7)

do_something_to_apologize()抛出的异常将被捕获。包含raise的行永远不会运行,因为do_something_to_apologize抛出了异常。此外,我不相信有任何关于&#34; priority&#34;在python例外中。