首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python "raise from“用法

Python "raise from“用法
EN

Stack Overflow用户
提问于 2014-07-15 15:33:02
回答 1查看 96.6K关注 0票数 291

Python语言中的raiseraise from有什么区别?

代码语言:javascript
复制
try:
    raise ValueError
except Exception as e:
    raise IndexError

哪一项会产生

代码语言:javascript
复制
Traceback (most recent call last):
  File "tmp.py", line 2, in <module>
    raise ValueError
ValueError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "tmp.py", line 4, in <module>
    raise IndexError
IndexError

代码语言:javascript
复制
try:
    raise ValueError
except Exception as e:
    raise IndexError from e

哪一项会产生

代码语言:javascript
复制
Traceback (most recent call last):
  File "tmp.py", line 2, in <module>
    raise ValueError
ValueError

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

Traceback (most recent call last):
  File "tmp.py", line 4, in <module>
    raise IndexError from e
IndexError
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-15 15:44:53

不同之处在于,当您使用from时,将设置__cause__属性,并且消息指出异常是由直接引起的。如果省略了from,则不会设置__cause__,但也可以设置__context__属性,然后回溯会在处理其他事件时显示上下文。

如果在异常处理程序中使用raise,则会设置__context__;如果在其他任何地方使用raise,也不会设置__context__

如果设置了__cause__,则还会在异常上设置__suppress_context__ = True标志;当__suppress_context__设置为True时,在打印回溯时将忽略__context__

当从不想显示上下文的异常处理程序引发异常(不希望在处理另一个发生异常的消息时)时,请使用raise ... from None__suppress_context__设置为True

换句话说,Python设置了异常的上下文,这样您就可以自省异常发生在哪里,让您看到另一个异常是否被它替换了。您还可以向异常添加原因,使另一个异常的回溯显式显示(使用不同的措辞),并且忽略上下文(但在调试时仍然可以自省)。使用raise ... from None可以禁止打印上下文。

请参阅raise statement documenation

from子句用于异常链接:如果给定,第二个表达式必须是另一个异常类或实例,然后将其作为__cause__属性附加到引发的异常(该属性是可写的)。如果引发的异常未得到处理,则两个异常都将为printed:try:...打印(1/ 0) ...异常例外,如exc:...从exc中引发RuntimeError(“发生了不好的事情”) ...Traceback (最近一次调用):文件"",第2行,在ZeroDivisionError中:整除或以零为模上述异常是以下异常的直接原因: Traceback (最近一次调用):文件"",第4行,在RuntimeError中:发生了一些不好的事情

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

尝试:...打印(1/ 0) ...除了:...引发RuntimeError(“发生了不好的事情”) ...happened (最近一次调用):文件"",第2行,in ZeroDivisionError:整除或以零为模在处理上述异常的过程中,出现了另一个异常: Traceback (最近一次调用):文件"",第4行,位于RuntimeError: Something bad the

另请参阅Built-in Exceptions documentation,了解附加到异常的上下文和原因信息的详细信息。

票数 335
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24752395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档