让一个例外引起

2024-03-29 00:12:49 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以让异常在其自己的类实例中引发自己? 像这样:

class Error(Exception):
    def __init__(self):
        if some stuff:
            pass
        elif some other stuff:
            # re-raise myself

raise Error()

我试图使用raise self,但它返回一个错误;而且,我没有看到异常类的任何属性似乎与此链接。在

编辑

如果我想这样做,那是因为我在Exception类中附加了一些特殊的方法,这些方法根据传递给异常的参数来格式化要打印的错误消息。我本可以在一个单独的对象中完成格式化工作,但是由于它只被异常使用,所以我觉得很自然地将它附加到异常类本身。在


Tags: 实例方法selfifinitdef错误exception
3条回答

这可能会解决您当前的错误:

raise self.__class__

然而,你有无限递归的潜力。如果“其他的东西”总是真的呢?在

编辑:不应接受此答案。poke's answer解决问题的核心并给出正确的解决方案。在

自我提高的课程对我来说似乎很管用:

>>> class Err(Exception):
...   def __init__(self):
...     Exception.__init__(self, 'gulp!')
...     raise self
... 
>>> raise Err()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in __init__
__main__.Err: gulp!

我不是Python语言导出程序,所以这可能是一些奇怪的半中止类,它本身的行为不是很好。当心清空者。在

尖锐的问题是:你为什么要这样做?有什么原因不想使用标准的Python习惯用法在构造异常之后显式地引发异常吗?在

您可以在异常类型的__init__中引发异常,就像在任何类型的__init__中一样。但是这将阻止创建对象,而是引发异常。在

因此,您原来的raise Error()根本不会被调用,而且您要在其中创建的异常对象也永远不会被创建。相反,您只会得到一个异常,因为您创建的对象(Error)无法创建。在

因此,您将丢失有关实际要执行的raise的所有信息。在

因此,不,不要那样做。在

无论如何,这似乎也是一种非常奇怪的方法来处理异常类型。异常对象本身不应该依赖于任何外部因素,而且some stuff在这里看起来确实很神奇。你到底想解决什么问题?在

写下你的raise Error()可能有助于理解:

e = Error()
raise e

因此,首先创建一个异常对象,然后才真正地将其提升。因此在该类型的__init__中,您不能重新调用它,因为它还没有被引发过。不过,反正也没必要重估,因为事后你还在养呢。再说一遍:你想做什么?是否希望异常对象本身能够在特定条件下阻止引发(因此在代码中出现pass)?在

更新

it is because I've attached some special methods to my Exception class, which format the error message to be printed depending of what parameters are passed to the exception.

这根本没有理由在类型为__init__中引发异常。您可以随意格式化异常消息,而不必在类本身中引发异常。例如:

^{pr2}$

如您所见,我可以以任何方式更改异常消息,而不必在类中引发异常。在

相关问题 更多 >