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我在最后所做的,但都显示在控制台中。
为什么它们都显示,我如何更改代码以便只显示第二个,或者有更好的方法来实现我想要的?
控制台在此处显示上下文;当异常处理程序引发异常时,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:Run Code Online (Sandbox Code Playgroud)raise new_exc from original_excfrom 后面的表达式必须是异常 or
None。它将被设置为__cause__引发的异常。Setting__cause__还隐式地将__suppress_context__属性设置为True,以便 usingraise new_exc from None有效地用新异常替换旧异常以用于显示目的(例如转换KeyError为AttributeError),同时保留旧异常可__context__用于调试时的自省。除了异常本身的回溯之外,默认回溯显示代码还显示这些链式异常。出现
__cause__时始终显示显式链接的异常。隐式链式异常 in__context__仅在__cause__为 None 且__suppress_context__为 false时才显示。
| 归档时间: |
|
| 查看次数: |
2102 次 |
| 最近记录: |