是否有可能在自己的类实例中让异常升级? 像这样:
class Error(Exception):
def __init__(self):
if some stuff:
pass
elif some other stuff:
# re-raise myself
raise Error()
我尝试使用raise self
但它返回错误;此外,我没有看到任何似乎与此链接的异常类的属性。
修改
如果我想这样做,那是因为我在我的Exception
类中附加了一些特殊方法,它根据传递给异常的参数来格式化要打印的错误消息。我本可以在一个单独的对象中完成格式化工作,但因为它只被异常使用,所以我很自然地将它附加到异常类本身。
答案 0 :(得分: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
正如您所看到的,我可以以任何方式更改异常消息,而无需在类中引发异常。
答案 1 :(得分:1)
编辑:此答案不应被接受。 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习惯用法在构造它之后明确地引发异常?
答案 2 :(得分:0)
这可能会解决您的即时错误:
raise self.__class__
然而,您有可能进行无限递归。如果“其他东西”总是如此?