是否可以让异常在其自己的类实例中自行引发? 像这样:
class Error(Exception):
def __init__(self):
if some stuff:
pass
elif some other stuff:
# re-raise myself
raise Error()
我已经尝试使用 raise self 但它返回了一个错误;另外,我没有看到似乎与此相关的异常类的任何属性。
编辑
如果我想这样做,那是因为我已将一些特殊方法附加到我的 Exception 类,这些方法根据传递给异常的参数格式化要打印的错误消息。我本可以在一个单独的对象中完成格式化工作,但由于它仅由异常使用,所以在我看来将它附加到异常类本身是很自然的。
请您参考如下方法:
您可以在异常类型的 __init__ 中引发异常,就像您可以在任何类型的 __init__ 中这样做一样。然而,这将阻止创建对象——而是抛出异常。
所以你原来的 raise Error() 根本不会被调用,你想在那里创建的异常对象也永远不会被创建。相反,您只会得到一个异常,因为无法创建您创建的对象(错误)。
因此,您丢失了有关要执行的实际 raise 的所有信息。
因此,不,不要那样做。
无论如何,这似乎也是一种非常奇怪的异常类型处理方式。异常对象自身 不应该依赖于任何外部因素,一些东西 在这里确实看起来很神奇。您实际上要在这里解决什么问题?
可能有助于理解的是,像这样编写您的 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__ 中引发异常 at all 是合理的。您可以轻松地根据需要格式化异常消息,而无需在类本身中引发异常。例如:
>>> 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
如您所见,我可以以任何我想要的方式更改异常消息,而无需在类中引发异常。
