定义一个无参数的异常:
class MyException(Exception):
pass
当提出时,以下两种情况有何不同:
raise MyException
和
raise MyException()
我找不到任何信息;这是否仅仅是一种过载的语法?定义一个无参数的异常:
class MyException(Exception):
pass
当提出时,以下两种情况有何不同:
raise MyException
和
raise MyException()
我找不到任何信息;这是否仅仅是一种过载的语法?简而言之,raise MyException
和raise MyException()
都会执行相同的操作。第一种形式会自动实例化您的异常。
来自文档的相关部分如下:
raise将第一个表达式作为异常对象进行评估。它必须是BaseException的子类或实例。如果它是一个类,则在需要时通过使用不带参数的类实例化来获取异常实例。
话虽如此,即使语义相同,第一种形式也微观地更快,而第二种形式更灵活(因为您可以传递参数,如果需要)。
Python中大多数人(即在标准库、常用应用程序和许多书籍中)使用的惯用风格是在没有参数时使用raise MyException
。只有在需要传递某些参数时,人们才直接实例化异常。例如:raise KeyError(badkey)
。
请查看raise语句的文档。它创建了一个MyException
的实例。
raise
的语法已经有些改变。但对于这个问题相关的部分仍然是一样的(raise ExceptionType
仍会通过调用其构造函数而创建该类型的一个实例,且不带任何参数)。 - Blckknght是的,ValueError
和ValueError()
之间有区别。
ValueError
是一个类,而ValueError()
创建了一个类的实例。这就是为什么type(ValueError) is type
和type(ValueError()) is ValueError
的原因。
raise
的唯一目的是引发异常,
当我们使用
ValueError
时,将调用类,从而运行构造函数ValueError()
当我们使用
ValueError()
时,直接调用方法ValueError()
。
注意:raise ValueError # 简写为 'raise ValueError()'