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

try:
    do_something_dangerous()
except:
    do_something_to_apologize()
    raise

由于您重新抛出异常,因此应该有一个“外部 catch-except”语句。但现在,我在想。如果 except 内的 do_something_to_apologize() 抛出错误怎么办?哪一个会被外面的“catch- except”捕获呢?是你重新抛出的还是 do_something_to_apologize() 抛出的?或者优先级最高的异常会首先被捕获吗?

有帮助吗?

解决方案

尝试一下,看看:

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 条款。原始异常在回溯中提到,但包含在后面的异常中并且无法再捕获。

其他提示

将捕获do_something_to_apologize()抛出的异常。由于do_something_to_apologizoologizoologizoologize抛出,含有的线不会运行。此外,我不相信Python例外情况下存在“优先”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top