引发Exception类和Exception实例之间有区别吗?

yas*_*sar 11 python exception

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

raise ValueError
raise ValueError()
Run Code Online (Sandbox Code Playgroud)

除了你可以在后一种情况下提供异常消息这一事实之外,这两种风格之间有什么根本区别吗?我应该选择一个吗?

ast*_*eal 9

文档都是有效的(没有意外的行为):

提出的唯一论据表明要提出的例外.这必须是异常实例或异常类(派生自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)
Run Code Online (Sandbox Code Playgroud)


alk*_*lko 8

总结评论:没有区别.两种语法都会抛出ValueError实例.文档的相关摘录:

如果它是一个类,则在需要时通过实例化没有参数的类来获取异常实例.