【问题标题】:Python equivalent of Java Exception with causePython 等价于 Java Exception with cause
【发布时间】:2020-05-01 02:25:54
【问题描述】:

在 Python 中有没有一种方法可以引发由另一个错误引起的错误?

在 Java 中,您可以创建一个异常实例,原因如下代码所示

try {
    throw new IOException();
} catch (IOException e) {
    throw new RuntimeException("An exception occurred while trying to execute", e);
}

导致此错误消息:

Exception in thread "main" java.lang.RuntimeException: An exception occurred while trying to execute
    at thing.Main.main(Main.java:11)
Caused by: java.io.IOException
    at thing.Main.main(Main.java:9)

请注意,第一个异常(在堆栈跟踪中)是由第二个“引起”的。

在我看来,这是向 API 用户显示调用期间发生了更高级别错误的好方法,开发人员可以通过查看作为“原因”的低级别异常来调试它更高级别的错误(在这种情况下,RuntimeException 是由 IOException 引起的)。

通过我所做的搜索,我无法找到任何关于在 Python 中将错误作为另一个错误的原因。这可以在 Python 中实现吗?如何?如果不是,那么 Pythonic 的等价物是什么?

【问题讨论】:

    标签: python exception


    【解决方案1】:

    在 Python 中,它是通过非常相似的结构实现的:

    try:
        raise ValueError
    except ValueError:
        raise ValueError('second exception')
    

    这将生成以下回溯:

    Traceback (most recent call last):
      File "main.py", line 2, in <module>
        raise ValueError
    ValueError
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "main.py", line 4, in <module>
        raise ValueError('second exception')
    ValueError: second exception
    

    另一个 Python 功能是 raise from,它提供了稍微不同的回溯:

    try:
        raise ValueError
    except ValueError as e:
        raise ValueError('second exception') from e
    

    追溯:

    Traceback (most recent call last):
      File "main.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 "main.py", line 4, in <module>
        raise ValueError('second exception') from e
    ValueError: second exception
    

    进一步阅读:

    【讨论】:

    • “另一个 Python 特性是从中提出的,它提供了一个稍微不同的回溯:”唯一的区别是它在代码不同的地方打印不同的代码。 from &lt;current exception&gt; 隐含于 raise &lt;exception&gt;from 子句对于链接到其他异常或抑制异常链接(使用from None)很有用。
    • 所以基本上raise from 在回溯中澄清了第一个异常是预期的可能性,第二个错误告诉(或至少应该告诉)用户做错了什么?跨度>
    • @Masklinn 第一个回溯状态“在处理上述异常期间,发生了另一个异常”,而第二个状态“上述异常是以下异常的直接原因”。这清楚地表明,在第二种情况下,第二个异常是由于第一种情况而故意引发的,而在第一种情况下,它可能是一个意外异常。
    猜你喜欢
    • 2017-10-02
    • 2013-11-24
    • 2010-11-23
    • 2010-12-05
    • 2012-06-28
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多