问题:没有括号的“ raise exception()”和“ raise exception”之间有区别吗?
定义无参数异常:
class MyException(Exception):
pass
举起时,它们之间是否有任何区别:
raise MyException
和
raise MyException()
我找不到任何东西。它仅仅是一个重载的语法吗?
回答 0
简短的回答是,无论raise MyException
和raise MyException()
做同样的事情。第一种形式会自动实例化您的异常。
docs的相关部分说:“ 抬高将第一个表达式评估为异常对象。它必须是BaseException的子类或实例。如果是类,则在需要时通过使用实例化该类来获取异常实例。没有参数。”
也就是说,即使语义相同,第一种形式在微观上也更快,而第二种形式则更灵活(因为如果需要,可以将其传递给参数)。
大多数人在Python中(即在标准库,流行的应用程序和许多书中)使用的通常样式是在raise MyException
没有参数的情况下使用。人们仅在需要传递一些参数时才直接实例化异常。例如: raise KeyError(badkey)
。
回答 1
去看看该raise
声明的文档。它正在创建的实例MyException
。
回答 2
是的,ValueError
和之间有区别ValueError()
ValueError
是一个类,而ValueError()
创建一个类的实例。这就是原因type(ValueError) is type
和type(ValueError()) is ValueError
的唯一目的raise
是引发异常,
当我们使用时
ValueError
,将调用class,该class依次运行构造函数ValueError()
当我们使用时
ValueError()
,该方法ValueError()
被直接调用。
注意: raise ValueError # shorthand for 'raise ValueError()'