25

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

raise ValueError
raise ValueError()

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

4

2 回答 2

16

来自文档两者都是有效的(没有意外行为):

raise 的唯一参数表示要引发的异常。这必须是异常实例或异常类(从 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)
于 2013-11-04T13:29:04.410 回答
13

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

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

于 2013-11-04T13:26:43.963 回答