Не удалось уловить ошибку синтаксиса python
try:
x===x
except SyntaxError:
print "You cannot do that"
выходы
x===x
^
SyntaxError: invalid syntax
это не поймает его.
try:
x===x
except:
print "You cannot do that"
Другие ошибки, такие как NameError, ValueError, увлекательны.
Мысли?
Системные спецификации:
import sys
print(sys.version)
- > 2.7.5 (по умолчанию, 9 марта 2014, 22:15:05)
[GCC 4.2.1 Совместимый Apple LLVM 5.0 (clang-500.0.68)]
Ответы
Ответ 1
Вы можете перехватить SyntaxError
только в SyntaxError
случае, если он выкинут из операции eval
, exec
или import
.
>>> try:
... eval('x === x')
... except SyntaxError:
... print "You cannot do that"
...
You cannot do that
Это связано с тем, что, как правило, интерпретатор анализирует весь файл перед выполнением любого из него, поэтому он обнаруживает синтаксическую ошибку перед выполнением оператора try
. Если вы используете eval
или его друзей, чтобы заставить анализировать больше кода во время выполнения программы, то вы можете его поймать.
Я почти уверен, что это где-то в официальном руководстве, но сейчас я не могу его найти.
Ответ 2
SyntaxError
возникает, когда файл/код анализируется, а не когда эта строка кода выполняется. Причина этого проста: если синтаксис неверен в одной точке кода, синтаксический анализатор не может продолжить, поэтому весь код после этой строки не поддается анализу.
Другими словами, вы можете только улавливать синтаксические ошибки, когда python пытается что-то разобрать. Это включает в себя exec
, eval
, import
:
>>> try:
... import junk
... except SyntaxError:
... print "Woo"
...
Woo
и различные вещи относительно ast
и т.п.
Обратите внимание, что учебник по python даже различает SyntaxError
и другие исключения, хотя различие не так ясно, как это делает учебник (поскольку вы можете факт поймать SyntaxError
, если вы знаете, когда они будут подняты).