mic*_*yer 1 python exception python-3.x
是否有可能在自己的类实例中让异常自我提升?像这样的东西:
class Error(Exception):
def __init__(self):
if some stuff:
pass
elif some other stuff:
# re-raise myself
raise Error()
Run Code Online (Sandbox Code Playgroud)
我试过使用raise self但它返回一个错误; 此外,我没有看到任何似乎与此链接的异常类的属性.
编辑
如果我想这样做,那是因为我在我的Exception类中附加了一些特殊的方法,它根据传递给异常的参数来格式化要打印的错误消息.我本可以在一个单独的对象中完成格式化工作,但因为它只是由异常使用,所以我很自然地将它附加到异常类本身.
您可以在__init__异常类型中引发异常,就像您可以在任何类型中一样__init__.但是这会阻止创建对象 - 而是抛出异常.
因此,raise Error()根本不会调用您的原始文件,并且永远不会创建您想要在其中创建的异常对象.相反,您将获得异常,因为Error无法创建您创建的对象().
因此,您将丢失有关raise要执行的实际信息的所有信息.
因此,不,不要那样做.
无论如何,这也似乎是一种非常奇怪的方式来做异常类型.异常对象本身不应该依赖于任何外部因素,并且some stuff在这里确实看起来很神奇.你在这里尝试解决的是什么?
什么可能有助于理解,将写raise Error()这样的:
e = Error()
raise e
Run Code Online (Sandbox Code Playgroud)
因此,您首先创建一个异常对象,然后才实际提升它.所以在__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
Run Code Online (Sandbox Code Playgroud)
如您所见,我可以以任何方式更改异常消息,而无需在类中引发异常.
| 归档时间: |
|
| 查看次数: |
429 次 |
| 最近记录: |