Python 让一个例外出现
是否可以让异常在其自己的类实例中自行引发? 大概是这样的:Python 让一个例外出现,python,exception,python-3.x,Python,Exception,Python 3.x,是否可以让异常在其自己的类实例中自行引发? 大概是这样的: class Error(Exception): def __init__(self): if some stuff: pass elif some other stuff: # re-raise myself raise Error() e = Error() raise e 我试图使用提升自我,但它返回了一个错误;此外,我没有看到任何异常类的
class Error(Exception):
def __init__(self):
if some stuff:
pass
elif some other stuff:
# re-raise myself
raise Error()
e = Error()
raise e
我试图使用提升自我
,但它返回了一个错误;此外,我没有看到任何异常类的属性与此相关
编辑
如果我想这样做,那是因为我在我的Exception
类中附加了一些特殊的方法,这些方法根据传递给异常的参数格式化要打印的错误消息。我本可以在一个单独的对象中完成格式化工作,但由于它仅由异常使用,因此我觉得将其附加到异常类本身是很自然的。可以在异常类型的\uuuuu init\uuuu
中引发异常,就像在任何类型的\uuuu init\uuu
中一样。但是,这将阻止创建对象,而会引发异常
因此,您原来的raise Error()
将根本不会被调用,并且您想要在那里创建的异常对象将永远不会被创建。相反,由于无法创建您创建的对象(Error
),您将得到一个异常
因此,您将丢失有关要执行的实际提升的所有信息
因此,不,不要那样做
无论如何,这似乎也是一种非常奇怪的方式来创建异常类型。异常对象本身不应该依赖于任何外部因素,而且某些东西在这里看起来确实很神奇。你到底想解决什么问题
可能有助于理解的是,像这样编写您的raiseerror()
:
class Error(Exception):
def __init__(self):
if some stuff:
pass
elif some other stuff:
# re-raise myself
raise Error()
e = Error()
raise e
因此,首先创建一个异常对象,然后才实际引发它。因此,在该类型的\uuuuu init\uuuuu
中,您无法重新激活它,因为它从未被引发过。但无论如何,也没有必要重新提高它,因为之后你仍在提高它。再说一遍:你想做什么?您是否希望异常对象本身能够在某些情况下阻止提升(因此代码中的过程
)
更新
这是因为我在Exception类中附加了一些特殊的方法,这些方法根据传递给异常的参数格式化要打印的错误消息
这根本不能证明在该类型的\uuuu init\uuu
中引发异常是正确的。您可以轻松地格式化异常消息,无需在类本身中引发异常。例如:
>>> 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
类错误(异常):
def uuu init uuuu(self,msg,righaligned=False,spacedOut=False):
如果spacedOut:
msg=''.join(msg)
如果右对齐:
msg=msg.rjust(72)
异常。初始化(self,msg)
>>>引发错误('随机消息')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
引发错误('随机消息')
错误:随机消息
>>>引发错误(“随机消息”,真)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
引发错误(“随机消息”,真)
错误:随机消息
>>>引发错误('随机消息',False,True)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
引发错误('随机消息',False,True)
错误:R a n d o m e s a g e
正如您所看到的,我可以以任何方式更改异常消息,而不必在类中引发异常。您可以在异常类型的\uuuu init\uuuuu
中引发异常,就像您可以在任何类型的\uuu init\uuuuu
中那样。但是,这将阻止创建对象,而会引发异常
因此,您原来的raise Error()
将根本不会被调用,并且您想要在那里创建的异常对象将永远不会被创建。相反,由于无法创建您创建的对象(Error
),您将得到一个异常
因此,您将丢失有关要执行的实际提升的所有信息
因此,不,不要那样做
无论如何,这似乎也是一种非常奇怪的方式来创建异常类型。异常对象本身不应该依赖于任何外部因素,而且某些东西在这里看起来确实很神奇。你到底想解决什么问题
可能有助于理解的是,像这样编写您的raiseerror()
:
class Error(Exception):
def __init__(self):
if some stuff:
pass
elif some other stuff:
# re-raise myself
raise Error()
e = Error()
raise e
因此,首先创建一个异常对象,然后才实际引发它。因此,在该类型的\uuuuu init\uuuuu
中,您无法重新激活它,因为它从未被引发过。但无论如何,也没有必要重新提高它,因为之后你仍在提高它。再说一遍:你想做什么?您是否希望异常对象本身能够在某些情况下阻止提升(因此代码中的过程
)
更新
这是因为我在Exception类中附加了一些特殊的方法,这些方法根据传递给异常的参数格式化要打印的错误消息
这根本不能证明在该类型的\uuuu init\uuu
中引发异常是正确的。您可以轻松地格式化异常消息,无需在类本身中引发异常。例如:
>>> 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
类错误(异常):
def uuu init uuuu(self,msg,righaligned=False,spacedOut=False):
如果spacedOut:
msg=''.join(msg)
如果右对齐:
msg=msg.rjust(72)
异常。初始化(self,msg)
>>>引发错误('随机消息')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
引发错误('随机消息')
错误:随机消息
>>>引发错误(“随机消息”,真)
回溯(最近一次呼叫最后一次):
文件“”,第行