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

Oha*_*Dan 95 python exception

定义无参数异常:

class MyException(Exception):
    pass
Run Code Online (Sandbox Code Playgroud)

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

raise MyException
Run Code Online (Sandbox Code Playgroud)

raise MyException()
Run Code Online (Sandbox Code Playgroud)

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

Ray*_*ger 107

简短的回答是两者raise MyExceptionraise MyException()做同样的事情.第一个表单auto实例化您的异常.

文档中相关部分说," raise将第一个表达式计算为异常对象.它必须是BaseException的子类或实例.如果它是一个类,则在需要时通过实例化类来获取异常实例没有争论."

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

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

  • 为什么第一种形式(没有括号)在显微镜下更快? (16认同)
  • @jamesdlin因为自动实例化的C代码没有解释的开销,而不是你自己进行调用. (13认同)

小智 5

去看一下docs 6.9中的raise关键字.raise语句
它正在创建myException的一个实例