“引发异常()”和“引发异常”没有括号之间有区别吗?

时间:2013-05-23 06:26:12

标签: python exception

定义无参数例外:

class myException(Exception):
    pass

提出时,之间有什么区别:

raise myException

raise myException()

尝试时,我找不到 - 这只是一个重载的语法吗?

3 个答案:

答案 0 :(得分:57)

简短的回答是raise MyExceptionraise MyException()都做同样的事情。第一个表单auto实例化你的异常。

relevant section from the docs说,“ raise 将第一个表达式计算为异常对象。它必须是子类或BaseException的实例。如果是类,则为异常实例将在需要时通过实例化没有参数的类来获得。“

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

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

答案 1 :(得分:6)

查看文档6.9. The raise statement中的raise关键字 它正在创建myException的实例

答案 2 :(得分:1)

是的,ValueErrorValueError()之间有区别

ValueError是一个类,而ValueError()是一个方法。这就是type(ValueError) is typetype(ValueError()) is ValueError

的原因

raise的唯一目的是引发异常

  

当我们使用ValueError时,将调用类,该类依次运行构造函数ValueError()

     

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

注意:raise ValueError # shorthand for 'raise ValueError()'