当前位置: 首页 > 面试题库 >

Python异常链接

司寇旺
2023-03-14
问题内容

有没有在Python中使用异常链的标准方法?就像Java异常“引起”一样?

这是一些背景。

我有一个具有一个主要异常类的模块DSError

 class DSError(Exception):
     pass

在此模块中的某处将有:

try:
    v = my_dict[k]
    something(v)
except KeyError as e:
    raise DSError("no key %s found for %s" % (k, self))
except ValueError as e:
    raise DSError("Bad Value %s found for %s" % (v, self))
except DSError as e:
    raise DSError("%s raised in %s" % (e, self))

基本上,此代码段仅应引发DSError并告诉我发生了什么以及为什么。问题是try块可能会引发许多其他异常,因此我更愿意执行以下操作:

try:
    v = my_dict[k]
    something(v)
except Exception as e:
    raise DSError(self, v, e)  # Exception chained...

这是标准的pythonic方法吗?我没有在其他模块中看到异常链,那么如何在Python中完成?


问题答案:

异常链接仅在Python 3中可用,您可以在其中编写:

try:
    v = {}['a']
except KeyError as e:
    raise ValueError('failed') from e

产生像

Traceback (most recent call last):
  File "t.py", line 2, in <module>
    v = {}['a']
KeyError: 'a'

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

Traceback (most recent call last):
  File "t.py", line 4, in <module>
    raise ValueError('failed') from e
ValueError: failed

在大多数情况下,您甚至都不需要from; 默认情况下,Python 3将显示异常处理期间发生的所有异常,如下所示:

Traceback (most recent call last):
  File "t.py", line 2, in <module>
    v = {}['a']
KeyError: 'a'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "t.py", line 4, in <module>
    raise ValueError('failed')
ValueError: failed

您可以在 Python 2中执行的操作 是向您的异常类添加自定义属性,例如:

class MyError(Exception):
    def __init__(self, message, cause):
        super(MyError, self).__init__(message + u', caused by ' + repr(cause))
        self.cause = cause

try:
    v = {}['a']
except KeyError as e:
    raise MyError('failed', e)


 类似资料:
  • 应用程序通常会通过抛出另一个异常来响应异常。 实际上,第一个异常引起第二个异常。 它可以是非常有助于用户知道什么时候一个异常导致另一个异常。 “异常链(Chained Exceptions)”帮助程序员做到这一点。 以下是Throwable中支持异常链的方法和构造函数。 Throwable getCause() Throwable initCause(Throwable) Throwable(St

  • constants.xml_path=“/acquirer.xml”;

  • 本文向大家介绍Java 常用类解析:java异常机制,异常栈,异常处理方式,异常链,异常丢失详解,包括了Java 常用类解析:java异常机制,异常栈,异常处理方式,异常链,异常丢失详解的使用技巧和注意事项,需要的朋友参考一下 1、java标准异常概述 Throwable表示任何可以作为异常被抛出的类,有两个子类Error和Exception。从这两个类的源代码中可以看出,这两个类并没有添加新的方

  • 问题内容: 我不明白在代码中具有链接异常的好处。 考虑到Java世界中的ResourceLoader示例,如果程序员知道遇到这种情况的可能性,为什么不捕获相同的异常呢?否则,程序员不必抛出新的实例,就可以在同一代码中捕获这两个异常? 问题答案: 任何人都可以提供有关需要链接异常的信息吗? 文章说得很好: 异常链接允许您将一种异常类型映射到另一种异常类型,以便方法可以抛出与该方法本身处于相同抽象级别

  • 问题内容: 我已经决定学习如何在Python中完成多线程,并且进行了比较以查看在双核CPU上可以获得什么样的性能提升。我发现我的简单多线程代码实际上比顺序运行的慢,我不知道为什么。 我进行的测试是生成大量随机数,然后打印最大数量 在我的Intel Core 2 Duo上完成大约需要6秒,而大约需要12秒。 然后,我尝试从两个线程调用ox()来查看完成的速度。 大约需要18秒才能完成,并且两个结果会

  • 我正在尝试编写允许我做4件事的代码,我正在使用try和except。 代码如下: 但我还需要使用2个例外。你能给我解释一下我怎么做吗? 主要目标是下载一个文件;如果仍然没有,下载第二个文件,依此类推。