专栏首页Python机器学习算法说书人Python|try/except捕捉SyntaxError

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机器学习算法说书人(Python-ML-Algorithm),作者:小陈学Python

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 用 GPU 运行代码,还有这种操作?!

    计算机组成原理里面提到计算机必须具备五大基本组成部件:运算器、控制器、存储器、输入设备和输出设备,其中运算器和控制器必定存在于 CPU 中。然而,如果 CPU ...

    不可言诉的深渊
  • Python 设计模式(4):生成器模式

    生成器模式与工厂方法模式有着相似之处,两者都属于创建型模式,并且都是将对象创建的任务交给一个单独的类去完成。

    不可言诉的深渊
  • NumPy高效使用逻辑,11个角度理顺它!

    使用Python的地方,就能看到Numpy,尤其是需要数值计算的地方,Numpy的高性能更是体现的淋漓尽致。

    不可言诉的深渊
  • MIT本科学神重启基于能量的生成模型,新框架堪比GAN

    值得注意的是,一作 Yilun Du 还是 MIT 的大四本科生,他从 15 年大一开始就发过 ECCV 16、NIPS 18 等多个大会和 Workshop ...

    机器之心
  • 5 点可以让你提高面试通过率建议(干货)

    自从我发过几篇关于面试经历的文章,由于我面试结果还不错,所有很多人来询问我一些面试相关的问题, 我这里给到 5 点建议,希望对大家有帮助。

    桃翁
  • Python|爬取短视频

    python是一种非常好用的爬虫工具。对于大多数的爬虫小白来说,python是更加简洁,高效的代码。今天就用实际案例讲解如何爬取动态的网站视频。

    算法与编程之美
  • 《ElasticSearch6.x实战教程》之分词

    本打算先介绍“简单搜索”,对ES的搜索有一个直观的感受。但在写的过程中发现分词无论如何都绕不过去。term查询,match查询都与分词息息相关,索性先介绍分词。

    用户1148394
  • NLP界“威震天”袭来!英伟达1小时成功训练BERT,83亿参数打造史上最大语言模型

    这个模型有多大?83亿个参数!比谷歌的 BERT 大24倍,比 OpenAI 的 GPT-2 大5.6倍!

    新智元
  • Oracle的SQL多版本控制 - VERSION_COUNT

    在上一期的“恩墨讲堂”微信课中,我提到了一个控制SQL多版本的参数,有很多朋友讨论,这个参数是:_CURSOR_OBSOLETE_THRESHOLD 。 为什么...

    数据和云
  • 异步IO\数据库\队列\缓存

    到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这哥俩的优势和劣势都非常的明显,我们一起来回顾下

    hankleo

扫码关注云+社区

领取腾讯云代金券