Можно ли обрабатывать ошибки синтаксиса?

Рассмотрим следующий код:

try:
    if True a = 1  #It missing a colon So it a SyntaxError!!!!!!!
except SyntaxError:
    print 'hey'

Вы ожидаете, что он напечатает hey Однако он поднимает SyntaxError, ту же ошибку, которую я пытаюсь избежать. Так можно ли обрабатывать все Исключения с помощью блока try-except? Хорошо Если SyntaxError было исключением, почему оно включено в встроенные исключения? и наконец, как я могу исправить вышеуказанный фрагмент кода так, чтобы он правильно обрабатывал исключение?

Примечание. Я знаю, что я пытаюсь сделать. Совершенно бессмысленно и не служит реальной цели.

Ответы

Ответ 1

SyntaxError - совершенно обычное встроенное исключение. Это не особенное никоим образом. Только обстоятельства, когда он (обычно) бросается, немного необычны.

Синтаксическая ошибка означает, что код с указанной ошибкой не может быть проанализирован. Он даже не становится действительной программой, поэтому он не может быть выполнен. Поэтому SyntaxError исключения возникают до запуска программы и, следовательно, не могут быть обнаружены внутри программы.

В частности, это исключение возбуждается парсером. Поскольку синтаксический анализатор работает полностью до того, как выполняется код, а не чередуется с ним, программа не может уловить свои собственные синтаксические ошибки.

Сам анализатор - это еще одна программа: Код, вызывающий парсер, может поймать SyntaxError как любое другое исключение (потому что это похоже на любое другое исключение). Примеры "вызова парсера" включают в себя:

  • compile, exec, eval
  • import
  • Несколько функций в таких модулях, как ast, tokenizer, parser и т.д.

Ответ 2

Конечно, вам нужно SyntaxError как встроенное исключение - что еще нужно повысить, если компилятор/парсер обнаруживает синтаксическую ошибку?

Вы правы, что эта ошибка обычно возникает во время компиляции, которая до того, как вы сможете ее поймать (время выполнения). (И как бы вы оправились от него?)

Я могу вспомнить одно исключение:

>>> try:
...    eval("hello =")
... except SyntaxError:
...    print("Hey! Who using eval() anyway??")
...
Hey! Who using eval() anyway??