Несоответствие SyntaxError в Python? - PullRequest
15 голосов
/ 06 декабря 2009

Рассмотрим эти два фрагмента:

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 неудовлетворителен;)

Ответы [ 2 ]

19 голосов
/ 06 декабря 2009

В первом случае исключение выдается компилятором, который запускает до структуры try/except, даже существует (так как его устанавливает сам компилятор сразу после разбора). Во втором случае компилятор запускается дважды - и возникает исключение, когда компилятор работает как часть eval, после , когда первый запуск компилятора уже настроил try/except .

Таким образом, для перехвата синтаксических ошибок, так или иначе, вы должны договориться, чтобы компилятор запускался дважды - eval - это один способ, явная compile встроенная функция вызывает другой, import вполне удобно (после записи кода в другой файл), exec и execfile других возможностей пока нет. Но как бы вы это ни делали, синтаксические ошибки могут быть обнаружены только после первого запуска компилятора для установки необходимых вам блоков try/except!

2 голосов
/ 06 декабря 2009

Краткий ответ: Нет.

Синтаксические ошибки возникают при синтаксическом анализе кода, что для нормального кода Python перед выполнением кода - код не выполняется внутри блока try / исключением, поскольку код не выполняется, точка.

Однако, когда вы проверяете или исполняете некоторый код, вы анализируете его во время выполнения, чтобы вы могли перехватить исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...