Each Answer to this Q is separated by one/two green lines.
try: x===x except SyntaxError: print "You cannot do that"
x===x ^ SyntaxError: invalid syntax
this does not catch it either
try: x===x except: print "You cannot do that"
Other errors like NameError, ValueError, are catchable.
import sys print(sys.version)
2.7.5 (default, Mar 9 2014, 22:15:05)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)]
You can only catch
SyntaxError if it’s thrown out of an
>>> try: ... eval('x === x') ... except SyntaxError: ... print "You cannot do that" ... You cannot do that
This is because, normally, the interpreter parses the entire file before executing any of it, so it detects the syntax error before the
try statement is executed. If you use
eval or its friends to cause more code to be parsed during the execution of the program, though, then you can catch it.
I’m pretty sure this is in the official manual somewhere, but I can’t find it right now.
SyntaxErrors get raised when the file/code is parsed, not when that line of code is executed. The reason for this is simple — If the syntax is wrong at a single point in the code, the parser can’t continue so all code after that line is un-parseable.
In other words, you can only catch syntax errors when python is trying to parse something. This includes
>>> try: ... import junk ... except SyntaxError: ... print "Woo" ... Woo
and various things regarding
ast and the like.
Note that the python tutorial even distinguishes between
SyntaxError and other exceptions although the distinction isn’t as clear as the tutorial makes it seem (since you can in fact catch
SyntaxError if you know when they get raised).