Python,抛出没有参数的异常

14 投票
3 回答
4442 浏览
提问于 2025-04-16 01:10

我想了解一下在没有参数的情况下抛出异常的最佳实践。在官方的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 个回答

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,而没有任何对象类或其他东西。这是在异常处理器中用来重新抛出当前异常的,并且会保留最初的错误追踪信息。

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..."

撰写回答