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)]
答案 0 :(得分:30)
如果SyntaxError
,eval
或exec
操作失败,您只能抓住import
。
>>> try:
... eval('x === x')
... except SyntaxError:
... print "You cannot do that"
...
You cannot do that
这是因为,通常,解释器在执行任何文件之前解析整个文件,因此它会在执行try
语句之前检测语法错误。如果您使用eval
或其朋友在程序执行期间使解析更多代码,那么您可以抓住它。
我很确定这是在某个官方手册中,但我现在找不到它。
答案 1 :(得分:17)
SyntaxError
被引发,而不是在执行该行代码时引发。原因很简单 - 如果代码中的单个点的语法错误,解析器就无法继续,因此该行之后的所有代码都是不可解析的。
换句话说,当python尝试解析某些东西时,你只能捕获语法错误。其中包括exec
,eval
,import
:
>>> try:
... import junk
... except SyntaxError:
... print "Woo"
...
Woo
以及有关ast
之类的各种事情。
请注意,python tutorial甚至可以区分SyntaxError
和其他例外情况,但区别并不像教程所显示的那样明显(因为您实际上可以抓住SyntaxError
如果你知道何时他们会被提出来。)