Не удалось уловить ошибку синтаксиса python

try:
    x===x
except SyntaxError:
    print "You cannot do that"

выходы

    x===x
       ^
SyntaxError: invalid syntax

это не поймает его.

try:
    x===x
except:
    print "You cannot do that"

Другие ошибки, такие как NameError, ValueError, увлекательны.

Мысли?

Системные спецификации:

import sys
print(sys.version)

- > 2.7.5 (по умолчанию, 9 марта 2014, 22:15:05) [GCC 4.2.1 Совместимый Apple LLVM 5.0 (clang-500.0.68)]

Ответ 1

Вы можете перехватить SyntaxError только в SyntaxError случае, если он выкинут из операции eval, exec или import.

>>> try:
...    eval('x === x')
... except SyntaxError:
...    print "You cannot do that"
... 
You cannot do that

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

Я почти уверен, что это где-то в официальном руководстве, но сейчас я не могу его найти.

Ответ 2

SyntaxError возникает, когда файл/код анализируется, а не когда эта строка кода выполняется. Причина этого проста: если синтаксис неверен в одной точке кода, синтаксический анализатор не может продолжить, поэтому весь код после этой строки не поддается анализу.

Другими словами, вы можете только улавливать синтаксические ошибки, когда python пытается что-то разобрать. Это включает в себя exec, eval, import:

>>> try:
...    import junk
... except SyntaxError:
...    print "Woo"
... 
Woo

и различные вещи относительно ast и т.п.

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