Непоследовательность SyntaxError в Python?
Рассмотрим эти два фрагмента:
try:
a+a=a
except SyntaxError:
print "first exception caught"
.
try:
eval("a+a=a")
except SyntaxError:
print "second exception caught"
Во втором случае выводится инструкция "второе исключение.." (исключение поймано), а в первом - нет.
Является первым исключением (позволяет называть его "SyntaxError1" ) любым, отличным от второго ( "SyntaxError2" )?
Есть ли способ поймать SyntaxError1 (таким образом, подавляя ошибки времени компиляции)? Обтекание больших блоков кода в eval
неудовлетворительно;)
Ответы
Ответ 1
В первом случае исключение возникает компилятором, который работает до того, как структура try/except
даже существует (так как сам компилятор установит ее сразу после разбора). Во втором случае компилятор работает дважды - и возникает исключение, когда компилятор работает как часть eval
, после того, как первый запуск компилятора уже настроил try/except
.
Итак, чтобы перехватывать синтаксические ошибки, так или иначе, вам нужно организовать выполнение компилятора дважды - eval
- это один способ, явная compile
встроенная функция вызывает другую, import
вполне (после написания кода в другой файл), exec
и execfile
еще и другие возможности. Но, тем не менее, вы это делаете, синтаксические ошибки могут быть обнаружены только после того, как компилятор выполнил первый раз для настройки блоков try/except
, которые вам нужны!
Ответ 2
Короткий ответ: Нет.
Синтаксические ошибки возникают при анализе кода, который для обычного кода Python перед выполнением кода - код не выполняется внутри блока try/except, так как код не выполняется, период.
Однако, когда вы eval или выполняете некоторый код, вы анализируете его во время выполнения, чтобы вы могли поймать исключение.