Python中抛出无参数异常

14

我想了解关于不带参数引发异常的最佳实践。 在官方Python文档中,你可以看到这个:

try:
    raise KeyboardInterrupt

(http://docs.python.org/tutorial/errors.html 第8.6章)

在一些不同的代码中,比如Django或Google code中,你能看到这个:

  def AuthenticateAndRun(self, username, password, args):
    raise NotImplementedError()

(http://code.google.com/p/neatx/source/browse/trunk/neatx/lib/auth.py)

在没有参数的情况下,异常在被引发之前就已经实例化了。实例化一个没有参数的异常的目的是什么?我应该使用第一种情况还是第二种情况?

提前感谢 法比安

3个回答

5
你可以使用任何一种表单。在Python 2和3中,两者都是合法的,没有真正的区别。Python风格指南没有指定哪一个是推荐的。

关于“类表单”支持的更多信息:

try:
    raise KeyboardInterrupt

这个表单在Python 2和3中都是完全合法的。 来自pep-3109的摘录:

raise EXCEPTION用于引发新异常。该形式有两个子变体:EXCEPTION可以是异常类或异常类的实例;有效的异常类是BaseException及其子类[5]。如果EXCEPTION是子类,则将调用它而不带任何参数以获取异常实例。

它也在Python文档中描述:

......如果它是一个类,那么在需要时将通过使用没有参数实例化该类来获得异常实例。


2
抛出异常类而不是异常实例的语法已经过时,新代码中不应使用。
raise Exception, "This is not how to raise an exception..."

对于那些好奇的人,请查看http://www.python.org/dev/peps/pep-0352/#transition-plan,了解更多关于异常相关弃用的信息。 - Wayne Werner
8
我理解您的意思是您不太明白对方在推荐什么。对方给出的代码示例似乎是一个反面教材。也许应该展示一下正确的做法。 - S.Lott

0
在像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本身。没有任何对象类或其他东西。它用于异常处理程序中重新引发当前异常,并保留初始回溯。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接