Python:即使在 try/except 子句中捕获也会引发异常

use*_*725 5 python exception-handling exception try-catch python-3.x

在我的代码中,我想在发生异常时捕获异常,将一些与异常相关的信息打印到屏幕上,然后在完成后结束脚本。我尝试使用与以下代码等效的东西,但我不明白为什么我会得到我所做的回溯。

执行时:

try:
    1 / 0
except ZeroDivisionError:
    print("Exception: ZeroDivisionError")
    raise Exception
Run Code Online (Sandbox Code Playgroud)

控制台读取:

Exception: ZeroDivisionError
Traceback (most recent call last):
  File "<pyshell#19>", line 2, in <module>
    1 / 0
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<pyshell#19>", line 5, in <module>
    raise Exception
Exception
Run Code Online (Sandbox Code Playgroud)

我想如果我抓住了ZeroDivisionError,它就不会再被提出,唯一会显示的是raise Exception我在最后所做的,但都显示在控制台中。

为什么它们都显示,我如何更改代码以便只显示第二个,或者有更好的方法来实现我想要的?

Mar*_*ers 6

控制台在此处显示上下文;当异常处理程序引发异常时,Python 会附加活动异常作为__context__属性,并且 Python 稍后会在未处理新异常的情况下显示该上下文。如果您不想显示上下文,则需要提供一个原因;你可以提供一个空的原因raise ... from None

try:
    1 / 0
except ZeroDivisionError:
    print("Exception: ZeroDivisionError")
    raise Exception from None
Run Code Online (Sandbox Code Playgroud)

引用raise声明文档

from子句用于异常链接:如果给定,则第二个表达式必须是另一个异常类或实例,然后将作为__cause__属性(可写)附加到引发的异常。如果未处理引发的异常,则将打印两个异常 [...]

如果在异常处理程序中引发异常,则类似的机制会隐式工作:然后将先前的异常附加为新异常的__context__属性[...]

例外文档中

当引发(或重新引发)except子句中的异常时,__context__会自动设置为最后捕获的异常;如果未处理新异常,则最终显示的回溯将包括原始异常和最终异常。

当引发新的异常时(而不是使用裸raise来重新引发当前正在处理的异常),隐式异常上下文可以通过使用fromwith来补充显式原因raise

raise new_exc from original_exc
Run Code Online (Sandbox Code Playgroud)

from 后面的表达式必须是异常 or None。它将被设置为__cause__引发的异常。Setting__cause__还隐式地将__suppress_context__属性设置为True,以便 usingraise new_exc from None有效地用新异常替换旧异常以用于显示目的(例如转换KeyErrorAttributeError),同时保留旧异常可__context__用于调试时的自省。

除了异常本身的回溯之外,默认回溯显示代码还显示这些链式异常。出现__cause__时始终显示显式链接的异常。隐式链式异常 in__context__仅在__cause__为 None 且__suppress_context__为 false时才显示。


归档时间:

查看次数:

2102 次

最近记录:

11 年,4 月 前