提问人:yasar 提问时间:11/4/2013 更新时间:11/4/2013 访问量:4921
提高 Exception 类和 Exception 实例有区别吗?
Is there a difference between raising Exception class and Exception instance?
问:
在 Python 中,我可以通过两种方式引发异常
raise ValueError
raise ValueError()
除了您可以在后一种情况下提供异常消息之外,这两种样式之间有什么根本区别吗?我应该选择其中之一吗?
答:
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)
评论
raise Class()
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.