Непоследовательность 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 или выполняете некоторый код, вы анализируете его во время выполнения, чтобы вы могли поймать исключение.