根据 Python 2 参考文档,raise
语句最多可以使用3个表达式来创建被抛出的异常:
raise_stmt ::= "raise" [expression ["," expression ["," expression]]]
如果第一个表达式是一个元组,Python将递归地“解包”该元组,一直取第一个元素,直到找到一个不是元组的元素为止。这种行为在 Python 3 中被移除(参见PEP 3109)。以下代码是合法的:
>>> raise ((Exception, 'ignored'), 'ignored'), 'something', None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Exception: something
文档详细解释了剩下的内容,但是raise语句希望第一个值是一个异常类(Exception class),第二个值被视为异常的值(消息),第三个值是一个回溯(traceback)。如果缺少后两个值,Python会用None填充。如果第一个值是一个实例(instance),第二个值必须为None。
>>> raise Exception('something'), 'something', None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: instance exception may not have a separate value
如果您使用的元组超过3个项目,则会引发语法错误:
>>> raise Exception, 'something', None, None
File "<stdin>", line 1
raise Exception, 'something', None, None
^
SyntaxError: invalid syntax
然而在你的情况下,你既没有定义一个类也没有创建一个实例,因此Python首先发现这个错误;如果我使用一个字符串,它也会抱怨:
>>> raise 'not an exception', 'something', None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: exceptions must be old-style classes or derived from BaseException, not str
正确的语法当然是:
>>> raise Exception, 'something', None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Exception: something
raise_stmt ::= "raise" [expression ["from" expression]]
。 - Barmar