无法捕获语法错误python

hum*_*ing 22 python error-handling

try:
    x===x
except SyntaxError:
    print "You cannot do that"
Run Code Online (Sandbox Code Playgroud)

输出

    x===x
       ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

这也没有抓住它

try:
    x===x
except:
    print "You cannot do that"
Run Code Online (Sandbox Code Playgroud)

其他错误,如NameError,ValueError,都是可捕获的.

思考?

系统规格:

import sys
print(sys.version)
Run Code Online (Sandbox Code Playgroud)

- > 2.7.5(默认,2014年3月9日,22:15:05)[GCC 4.2.1兼容的Apple LLVM 5.0(clang-500.0.68)]

zwo*_*wol 36

你也只能望尘莫及SyntaxError,如果它抛出一个中eval,execimport运行.

>>> try:
...    eval('x === x')
... except SyntaxError:
...    print "You cannot do that"
... 
You cannot do that
Run Code Online (Sandbox Code Playgroud)

这是因为通常,解释器在执行任何文件之前会解析整个文件,因此它会在try执行语句之前检测语法错误.但是,如果您使用eval或其朋友在程序执行期间导致更多代码被解析,那么您可以捕获它.

我很确定这是在某个官方手册中,但我现在找不到它.

  • @ak0817 不,Python 不是这样工作的。它有一个提前编译阶段,可以解析整个文件并构造一个“字节码”表示(这就是“.pyc”文件中的内容);实际的解释器循环在字节码上运行。现在大多数“解释型”语言都会这样做,因为它效率更高。事实上,我想不出_指定_在运行时逐行解析文件的_任何_语言。 (2认同)

mgi*_*son 20

SyntaxError解析文件/代码时引发,而不是在执行该行代码时引发.原因很简单 - 如果代码中的单个点的语法错误,则解析器无法继续,因此该行之后的所有代码都是不可解析的.

换句话说,当python尝试解析某些内容时,您只能捕获语法错误.这包括exec,eval,import:

>>> try:
...    import junk
... except SyntaxError:
...    print "Woo"
... 
Woo
Run Code Online (Sandbox Code Playgroud)

以及关于ast诸如此类的各种事物.

请注意,python教程甚至可以区分SyntaxError和其他异常,尽管区别并不像教程所显示的那样明显(因为SyntaxError如果你知道它们何时被提升,你实际上可以捕获).