提高 Exception 类和 Exception 实例有区别吗?

Is there a difference between raising Exception class and Exception instance?

提问人:yasar 提问时间:11/4/2013 更新时间:11/4/2013 访问量:4921

问:

在 Python 中,我可以通过两种方式引发异常

raise ValueError
raise ValueError()

除了您可以在后一种情况下提供异常消息之外,这两种样式之间有什么根本区别吗?我应该选择其中之一吗?

Python 异常

评论

2赞 Jon Clements 11/4/2013
如果你提出一个类,它就会有效地转换为(例如,在没有参数的情况下创建),但我目前找不到参考......raise Class()
2赞 alko 11/4/2013
参考资料: docs.python.org/3/reference/...
0赞 Jon Clements 11/4/2013
@alko是的...... 差不多说明了一切Otherwise, raise evaluates the first expression as the exception object. It must be either a subclass or an instance of BaseException. If it is a class, the exception instance will be obtained when needed by instantiating the class with no arguments.

答:

19赞 alko 11/4/2013 #1

总结一下评论:没有区别。任一语法都会引发 ValueError 实例。文档的相关摘录

如果是类,则在需要时获取异常实例 通过实例化不带参数的类。

31赞 astreal 11/4/2013 #2

文档中可以看出,两者都是有效的(没有意外行为):

要提出的唯一参数表示要提出的异常。这必须是异常实例或异常类(派生自 Exception 的类)。

在我看来,如果你想让它保存数据,就需要使用一个实例,无论是消息(如你所说)还是自定义数据或其他什么。

正如@alko所说,如果你不给出一个实例,它将实例化一个没有参数的实例。

如果您需要一个必需的参数,这将不起作用:

>>> class MyError(Exception):
...    def __init__(self, message, data=None):
...       self.msg = message
...       self.data = data or {}
...
>>> raise MyError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() takes at least 2 arguments (1 given)