Skip to main content
 首页 » 编程设计

python之让异常自己产生

2025年05月04日14davidwang456

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

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 

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