Python引用了两个参数

use*_*336 4 python exception python-2.7

怎么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
Run Code Online (Sandbox Code Playgroud)

谢谢!

Mar*_*ers 9

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

raise Exception, value
Run Code Online (Sandbox Code Playgroud)

通常完全等同于:

raise Exception(value)
Run Code Online (Sandbox Code Playgroud)

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

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

raise Exception, e
Run Code Online (Sandbox Code Playgroud)

相当于:

raise e
Run Code Online (Sandbox Code Playgroud)

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

raise E, ()
Run Code Online (Sandbox Code Playgroud)

或者None:

raise E, None
Run Code Online (Sandbox Code Playgroud)

只是为了增加E没有参数的异常类型的提升方式; 元组第二个参数指定要用于E异常类型的所有参数; 一个空的元组或None只是使其相当于raise E().

作为使用元组作为第一个参数,即等同于使用raise Exception作为Python会解开用作第一参数的嵌套元组.

raise声明文件:

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

所有这些规则使得声明变得复杂,并且有多种方法可以提出功能上相同的异常.因此,raise已经从Python 3中完全删除了多参数语法,请参阅PEP 3109 - 在Python 3000中提高异常.