110

定义无参数异常:

class MyException(Exception):
    pass

提出时,两者之间是否有任何区别:

raise MyException

raise MyException()

我找不到任何东西;它只是一个重载的语法吗?

4

3 回答 3

129

简短的回答是两者都raise MyExceptionraise MyException()同样的事情。第一种形式自动实例化您的异常。

文档中的相关部分说:

raise将第一个表达式计算为异常对象。它必须是 BaseException 的子类或实例。如果是类,则在需要时通过实例化不带参数的类来获取异常实例。

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

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

于 2013-05-23T08:36:33.587 回答
5

去看看声明的文档raise。它正在创建一个MyException.

于 2013-05-23T06:34:35.367 回答
-2

ValueError是的,和之间有区别ValueError()

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

的唯一目的raise是引发异常,

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

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

笔记:raise ValueError # shorthand for 'raise ValueError()'

于 2018-12-30T15:58:36.817 回答