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定时任务,能挣五千,问我信吗?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值