您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python“提高”用法

Python“提高”用法

区别在于,当您使用时from,将设置 __cause__ 属性,并且消息将指出异常是 由引起的 。如果您省略,from__cause__设置no ,但也可以设置该 __context__ 属性,然后回溯显示上下文,就像处理其他事件时一样

__context__如果raise在异常处理程序中使用过,则设置发生的情况;如果您raise在其他任何地方使用过,则也不会__context__设置。

如果__cause__设置了a,那么__suppress_context__ = True还会在异常上设置一个标志;当__suppress_context__设置为时,在打印回溯时True__context__忽略。

从异常处理程序,你养的时候 希望显示上下文(不想 处理另一个异常发生时 ,然后用消息)raise ... from None来设置__suppress_context__True

换句话说,Python在异常上设置了一个 上下文 ,因此您可以自省引发异常的位置,让您查看是否用它替换了另一个异常。您还可以将 原因 添加到异常中,使回溯明确地显示一个异常(使用不同的措辞),并且上下文将被忽略(但在调试时仍可以自省)。使用raise ... from None使您可以禁止打印上下文。

请参阅raise语句documenation

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

>>> try:
...     print(1 / 0)
... except Exception as exc:
...     raise RuntimeError("Something bad happened") from exc
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: int division or modulo by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened

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

>>> try:
...     print(1 / 0)
... except:
...     raise RuntimeError("Something bad happened")
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: int division or modulo by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened

另请参阅内置异常文档,获取有关上下文的详细信息,并在异常中附加原因信息。

python 2022/1/1 18:34:11 有207人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶