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?
去看看 raise语句的文档,它正在创建一个 MyException的实例。
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)。
raise KeyError(badkey)
是的,ValueError和 ValueError()是有区别的
ValueError
ValueError()
ValueError是一个类,而 ValueError()创建一个类的实例。这就是 type(ValueError) is type和 type(ValueError()) is ValueError的原因
type(ValueError) is type
type(ValueError()) is ValueError
raise的唯一目的是提出异常,
当我们使用 ValueError时,类将被调用,而类又运行构造函数 ValueError() 当我们使用 ValueError()时,方法 ValueError()被直接调用。
当我们使用 ValueError时,类将被调用,而类又运行构造函数 ValueError()
当我们使用 ValueError()时,方法 ValueError()被直接调用。
Note: raise ValueError # shorthand for 'raise ValueError()'
raise ValueError # shorthand for 'raise ValueError()'