Python|try/except捕捉SyntaxError

错误和异常

大家在编写程序的时候,多多少少都会出现各种问题。有的时候会让你的程序根本无法运行起来,有的时候会让你的程序在运行过程中出毛病。如果是第一种情况,我们把这个问题叫做程序错误;如果是第二种情况,我们把这个问题叫做程序异常。

处理错误和处理异常

当程序出现了问题,总要想办法处理。如果程序在运行前出错,就需要自己修正,让程序能运行。如果程序在运行时出错,程序特别简单时,我们可以使用条件判断避开出错的情况,如图所示。

这里就是一个简单的获取一个数组指定位置的元素,位置让用户输入,在用户输入的过程中我们首先要考虑用户输入的是不是一个整数。如果不是整数,就需要告诉用户输入错误;如果是整数,就继续判断这个整数是不是在合理的范围内。如果不在合理的范围内,就告诉用户出错。如果在合理的范围内,就正常输出用户想要的东西。就这么简单的一个程序,写这么多条件判断确实有点繁琐。如果遇到复杂的程序,if估计得嵌套死。有没有简单的方法,比如我只用一个if判断。办法还是有的,就是使用try/except来捕获这样的问题,修改代码如图所示。

看上去比第一种方法简单了好多,所以处理问题建议使用try/except,那么问题来了,是不是任何情况下都可以try/except呢?!答案显然是不可以的,try/except只能在程序运行时起作用,万一程序在运行前出错,这种方法就不再适用了。我们来看下面一个例子。

这个程序很明显,在try里面有一个SyntaxError,到底能不能被捕捉到呢?运行一下看看就知道了,运行结果如图所示。

这就说明SyntaxError(语法错误)出现在运行前,而不是在运行时检查语法。同样的错误还有IndentationError(缩进错误)……

既然SyntaxError出现在运行前,为什么我今天的标题是Python|try/except捕捉SyntaxError呢?这是因为SyntaxError并不总是出现在运行前,有的时候会在运行时出现。要想让它在运行时出现,我必须首先介绍两个函数——exec和eval。

exec和eval

exec和eval到底是何方神圣,我直接使用help来进行查看了,首先是exec,如图所示。

稍微翻译一下,这个函数主要是用来执行存放在字符串中的代码。下面再来看一下eval,如图所示。

稍微翻译一下,这个函数主要用来计算字符串表达式的值,和执行代码还是有点不一样的!

当字符串代码出现SyntaxError

下面我直接验证一下当字符串代码出现SyntaxError时能不能捕获,如图所示。

运行结果如图所示。

从运行结果中可以看出,SyntaxError被捕获了,程序并没有崩溃。为什么会这样?我们先分析一下程序的执行过程:首先检查语法和缩进有没有问题,然后开始执行程序,try里面调用exec这个函数,在这个函数的执行过程中,解释器发现了问题,此时except捕获了这个问题。这里引发的SyntaxError是运行时的SyntaxError,不是运行前的。既然是运行时的问题,就可以被捕获!

原文发布于微信公众号 - 小陈学Python(gh_a29b1ed16571)

原文发表时间:2018-10-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券