try…catch捕捉不到的神秘异常
看代码:
try:
x===y
except SyntaxError:
print("这样做是不对的!")
运行这段代码会得到如下错误:
File "/Users/maishu/git/wx_maishucode/code/064.py", line 2
x===y
^
SyntaxError: invalid syntax
我们明明使用了try…catch,它应该可以捕捉到异常并打印:
这样做是不对的!
但事实上根本没有打印这句话,而是抛出了上面的错误。
难道try…catch不能捕捉这种SyntaxError吗?YES and NO。
那我们换一种写法:
try:
eval('x===y')
except SyntaxError:
print "这样做是不对的!"
我们通过eval()函数来执行同样的语句。
eval()是Python的内置函数。你给它传递一个字符串,它会把这段字符串当做代码来执行。
执行上面的代码,可以得到预期的输出:
这样做是不对的!
这又说明了try…catch确实可以捕捉SyntaxError。
那到底是怎么回事呢?
答案是:try…catch只能捕捉由eval,exec或import操作所抛出的SyntaxError。
因为Python在执行一个代码文件前(比如064.py),会首先扫描整个文件。
如果在扫描过程中发现了语法错误(SyntaxError),它就直接报错,根本不会执行代码,也就轮到try…catch去捕捉错误了。
而通过eval,exec或import等执行代码,在扫描阶段无法识别它们参数中的语法错误。
只有能到真正执行的时候才会抛出,这时候try…catch已经起作用了,所以可以成功捕获异常。