Is there a difference between "raise exception()" and "raise exception" without parenthesis?

Defining a parameterless exception:

class MyException(Exception):
pass

When raised, is there any difference between:

raise MyException

and

raise MyException()

I couldn't find any; is it simply an overloaded syntax?

12845 次浏览

去看看 raise语句的文档,它正在创建一个 MyException的实例。

The short answer is that both raise MyException and raise MyException() do the same thing. This first form auto instantiates your exception.

文件的相关部分表示:

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.

也就是说,即使语义相同,第一种形式在微观上更快,而第二种形式更灵活(因为如果需要,可以传递参数)。

大多数人在 Python 中(即在标准库、流行应用程序和许多书籍中)使用的通常风格是在没有参数时使用 raise MyException。只有在需要传递某些参数时,人们才会直接实例化异常。例如: raise KeyError(badkey)

是的,ValueErrorValueError()是有区别的

ValueError是一个类,而 ValueError()创建一个类的实例。这就是 type(ValueError) is typetype(ValueError()) is ValueError的原因

raise的唯一目的是提出异常,

当我们使用 ValueError时,类将被调用,而类又运行构造函数 ValueError()

当我们使用 ValueError()时,方法 ValueError()被直接调用。

Note: raise ValueError # shorthand for 'raise ValueError()'