13

我想知道在没有参数的情况下引发异常的最佳实践。在官方 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

在没有参数的情况下,该异常在被引发之前是实例化的。实例化没有参数的异常的目的是什么?我什么时候应该使用第一种情况或第二种情况?

在此先感谢法比恩

4

3 回答 3

5

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


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

try:
    raise KeyboardInterrupt

这种形式在 Python 2 和 3 中都是完全合法的。摘自pep-3109

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

它也在Python 文档中进行了描述:

...如果是类,则在需要时通过实例化不带参数的类来获取异常实例。

于 2014-03-05T07:45:45.943 回答
2

引发异常类而不是异常实例是不推荐使用的语法,不应在新代码中使用。

raise Exception, "This is not how to raise an exception..."
于 2010-07-12T12:48:47.167 回答
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 。没有任何对象类或任何东西。它在异常处理程序中用于重新引发当前异常并保留初始回溯。

于 2010-07-12T12:58:44.187 回答