try..catch捕捉不到的神秘异常

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已经起作用了,所以可以成功捕获异常。

推荐阅读

表弟说,这个Python定时任务,能挣五千,问我信吗?

你可能感兴趣的:(python,开发语言,后端)