Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 让一个例外出现_Python_Exception_Python 3.x - Fatal编程技术网

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行,在 引发错误('随机消息') 错误:随机消息 >>>引发错误(“随机消息”,真) 回溯(最近一次呼叫最后一次): 文件“”,第行