无法捕获语法错误python

时间:2014-07-31 01:18:50

标签: python error-handling

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

2 个答案:

答案 0 :(得分:30)

如果SyntaxErrorevalexec操作失败,您只能抓住import

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

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

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

答案 1 :(得分:17)

当文件/代码为parsed时,

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

换句话说,当python尝试解析某些东西时,你只能捕获语法错误。其中包括execevalimport

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

以及有关ast之类的各种事情。

请注意,python tutorial甚至可以区分SyntaxError和其他例外情况,但区别并不像教程所显示的那样明显(因为您实际上可以抓住SyntaxError如果你知道何时他们会被提出来。)