1

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

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

raise Error()

我尝试使用raise self但它返回错误;另外,我没有看到似乎与此相关的异常类的任何属性。

编辑

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

4

3 回答 3

6

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

所以你的原始raise Error()文件根本不会被调用,你想在那里创建的异常对象永远不会被创建。相反,您只会得到一个异常,因为您创建的对象 ( Error) 无法创建。

raise所以你丢失了关于你想要执行的实际的所有信息。

因此,不,不要那样做。

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

可能有助于理解的方法是这样写raise Error()

e = Error()
raise e

因此,您首先创建一个异常对象,然后才真正引发它。所以在__init__那个类型的里面,你不能再加注它,因为它还没有被加注过。但是无论如何都没有必要重新加注,因为你之后仍然在加注。再说一遍:你想做什么?您是否希望异常对象本身能够在某些条件下防止引发(因此pass在您的代码中)?

更新

这是因为我在我的 Exception 类中附加了一些特殊方法,这些方法根据传递给异常的参数来格式化要打印的错误消息。

__init__这根本不能证明在类型引发异常是合理的。您可以轻松地格式化您想要的所有异常消息,而无需在类本身中引发异常。例如:

>>> class Error (Exception):
        def __init__ (self, msg, rightAligned = False, spacedOut = False):
            if spacedOut:
                msg = ' '.join(msg)
            if rightAligned:
                msg = msg.rjust(72)
            Exception.__init__(self, msg)

>>> raise Error('Random message')
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    raise Error('Random message')
Error: Random message
>>> raise Error('Random message', True)
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    raise Error('Random message', True)
Error:                                                           Random message
>>> raise Error('Random message', False, True)
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    raise Error('Random message', False, True)
Error: R a n d o m   m e s s a g e

如您所见,我可以以任何我想要的方式更改异常消息,而无需在类中引发异常。

于 2013-04-24T22:22:42.670 回答
1

编辑:这个答案不应该被接受。poke 的答案解决了问题的核心并提出了正确的解决方案。

自养课程对我来说似乎很有效:

>>> 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 习惯用法,即在构造异常后显式引发异常?

于 2013-04-24T22:27:41.163 回答
0

这可能会解决您的直接错误:

raise self.__class__

但是,您有无限递归的潜力。如果“其他一些东西”总是正确的呢?

于 2013-04-24T22:22:45.143 回答