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
谢谢!
答案 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。