Python,抛出没有参数的异常
我想了解一下在没有参数的情况下抛出异常的最佳实践。在官方的Python文档中,你可以看到这样的内容:
try:
raise KeyboardInterrupt
(http://docs.python.org/tutorial/errors.html 第8.6章)
而在一些不同的代码中,比如Django或者Google的代码,你也能看到这样的用法:
def AuthenticateAndRun(self, username, password, args):
raise NotImplementedError()
(http://code.google.com/p/neatx/source/browse/trunk/neatx/lib/auth.py)
在没有参数的情况下,异常是在被抛出之前就已经实例化了。那么,为什么要在没有参数的情况下实例化一个异常呢?我应该在什么情况下使用第一种方式,什么情况下使用第二种方式呢?
谢谢!
相关问题:
3 个回答
在像C++这样的编程语言中,你可以抛出任何对象,而不仅仅是异常。Python就比较严格。如果你尝试这样做:
raise 1
你会得到:
Traceback (most recent call last):
...
TypeError: exceptions must be old-style classes or derived from BaseException, not int
在Python的编程模式中,通常可以直接使用一个类,而不是先创建一个实例(这对于快速创建独特的实例很方便,只需要定义一个类)。所以你可以抛出一个异常类,而不是异常的实例,这也就不奇怪了。
不过,正如Ignacio所说,这种做法已经不推荐使用了。
另外,有一点额外的说明,虽然不是直接的问题:
你可能会在一些代码中看到单独使用raise,而没有任何对象类或其他东西。这是在异常处理器中用来重新抛出当前异常的,并且会保留最初的错误追踪信息。
你可以使用任何你喜欢的形式。在Python 2和3中,这两种写法没有实际区别,都是合法的。Python的风格指南也没有特别推荐哪一种。
关于“类形式”的支持,给你多一点信息:
try:
raise KeyboardInterrupt
这种写法在Python 2和3中都是完全合法的。
摘自pep-3109:
使用raise EXCEPTION可以抛出一个新的异常。这个形式有两个子变体:EXCEPTION可以是一个异常类,也可以是一个异常类的实例;有效的异常类包括BaseException及其子类[5]。如果EXCEPTION是一个子类,它会在没有参数的情况下被调用,以获取一个异常实例。
在Python文档中也有描述:
... 如果它是一个类,当需要时会通过不带参数实例化这个类来获取异常实例。
直接抛出一个异常类,而不是抛出一个异常实例,这种写法已经不推荐使用了,新的代码中最好不要这样做。
raise Exception, "This is not how to raise an exception..."