Python 引发异常类和异常实例之间有区别吗?

Python 引发异常类和异常实例之间有区别吗?,python,exception,Python,Exception,在Python中,我可以通过两种方式引发异常 raise ValueError raise ValueError() 除了在后一种情况下可以提供异常消息这一事实之外,这两种样式之间有什么根本区别吗?我应该选择其中一个吗?总结一下评论:没有区别。这两种语法都将抛出ValueError实例。相关: 如果它是一个类,那么将在需要时获取异常实例 通过实例化没有参数的类 两者都有效(无意外行为): 要引发的唯一参数指示要引发的异常。这必须是异常实例或异常类(从异常派生的类) 在我看来,如果您希望实例保存

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

raise ValueError
raise ValueError()

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

总结一下评论:没有区别。这两种语法都将抛出ValueError实例。相关:

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

两者都有效(无意外行为):

要引发的唯一参数指示要引发的异常。这必须是异常实例或异常类(从异常派生的类)

在我看来,如果您希望实例保存数据,则需要使用实例,无论它是消息(如您所说)还是自定义数据或其他内容

正如@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)
>>类MyError(异常):
...    定义初始化(self、message、data=None):
...       self.msg=消息
...       self.data=数据或{}
...
>>>升起我的箭
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:\uuuu init\uuuu()至少接受2个参数(给定1个)

如果你提出一个类,它会被有效地转换为
提出类()
(例如,创建时没有参数),但我目前找不到引用…引用:@alko-yup<代码>否则,raise将第一个表达式作为异常对象进行计算。它必须是BaseException的子类或实例。如果它是一个类,那么在需要时,可以通过不带参数的实例化该类来获得异常实例。基本上就是这么说的