Python引用了两个参数

时间:2014-04-07 19:16:14

标签: python python-2.7 exception

raise A, B做什么?它与raise A的作用有什么不同?

一些例子(在python 2.7的解释器上运行):

class E(Exception):
    pass
e = E()

raise Exception, e
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
__main__.E

raise Exception(e)
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
Exception

raise (Exception, e)
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
Exception

谢谢!

1 个答案:

答案 0 :(得分:9)

raise最多支持三个参数;前两个是类型和值,第三个是用于异常的回溯对象。这一行:

raise Exception, value

通常完全等同于:

raise Exception(value)

所以,创建一个Exception()的实例,将第二个值作为参数传递给异常构造函数。

但是,在您的示例中,第二个参数是E类型的实例,它是Exception的子类,因此行:

raise Exception, e

相当于:

raise e

你也可以在这里使用一个空元组:

raise E, ()

None

raise E, None

只是为了增加不带参数的E异常类型的提升方式;元组第二个参数指定用于E异常类型的所有参数;空元组或None只会使其等同于raise E()

至于使用元组作为第一个参数,这相当于将raise Exception用作Python will unwrap nested tuples used as the first argument

来自raise statement documentation

  

如果第一个对象是一个类,它将成为异常的类型。第二个对象用于确定异常值:如果它是类的实例,则实例将成为异常值。如果第二个对象是元组,则将其用作类构造函数的参数列表;如果为None,则使用空参数列表,并将任何其他对象视为构造函数的单个参数。通过调用构造函数创建的实例用作异常值。

所有这些规则使得声明变得复杂,并且有多种方法可以引发功能相同的异常。因此,完全从Python 3中删除了多参数raise语法,请参阅PEP 3109 - Raising Exceptions in Python 3000