Как указано в документации по Python 2 , оператор raise
принимает до 3 выражений для создания вызываемого исключения:
rise_stmt :: = "повысить"[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
В документации объясняется остальное более подробно, но оператор Повышение ожидает, что первое значение будет классом Исключения, второе значение рассматривается как значение исключения (сообщение) и третье значение является следом.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