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