Py学习  »  Python

警惕Python编程中异常处理结构可能的坑

Python小屋 • 5 年前 • 354 次点击  

推荐一本用于修炼Python编程内功的好书《Python程序设计开发宝典》(本文封面图片),扫码了解详情(京东链接):

==============================

所谓异常,主要是指由于测试不充分导致在实际运行时遇到意料之外的错误而引发的代码崩溃。例如让用户输入两个数然后输出两个数的商,结果用户把除数输入为0。例如让用户输入文件名然后程序输出其中的内容,结果用户输入的文件名不存在。例如网络临时发生故障导致无法连接服务器。这样的情况如果得不到及时处理都会引发代码崩溃。

异常处理结构的思路是直接执行功能代码,提前预测可能遇到的问题并设计好处理方案,到时候根据遇到的实际情况采取相应的方式进行处理,属于事后诊断与处理手段,是比较常用的代码健壮性保证技术。但如果使用不好的话,反而会带来一些问题,本文简单讨论常见的坑。

1)对于可能遇到的错误预测不完整。例如下面的代码只考虑除数不能为0,漏掉了输入无法转换成实数的情况:

2)把太多代码放在try块中。这样做的话,会导致异常处理结构非常庞大,因为可能引发的异常种类太多,非常不利于代码的维护,也很难准确定位出错的代码。

3)异常捕捉不精准,真实错误被隐藏。作为一般建议,应使用except语句捕捉尽可能精准的异常类型,针对除零错误、文件不存在、类型错误等不同的异常类型进行不同的处理。例如,下面这样的异常处理结构是没有什么实际意义的,因为不带任何异常类的except语句可以捕捉任何异常,并且提示信息也无法提供足够准确的信息帮助定位和修改错误代码:

4)except子句顺序有问题。作为一般建议,应按照由细到粗的顺序,首先捕捉和处理精准的异常,把所有能想到的异常都处理完之后,为了防止发生没有考虑到异常,最后增加一个不带任何异常类型的except子句或者捕捉异常基类Exception的except子句,如果顺序写的不对则可能会导致无法精准处理特定类型的异常或者导致语法错误。如果不带任何异常类的except没有出现在异常处理机构的最后则会引发语法错误,比较容易发现,而一旦捕捉异常基类Exception的except子句没有出现在最后,这样的错误不容易发现,隐蔽性较强。例如:

5)以为使用了异常处理结构就万事大吉了。例如下面的代码,虽然使用了异常处理结构,也考虑到了所有可能发生的情况,但是没有进行正确的处理,只是简单地输出了提示信息,导致后面的功能代码无法正确执行:


对于这样的情况,建议把功能代码放到异常处理结构的else子句中,例如下面的写法:

6)在函数中使用异常处理机构的话,一定不要在finally子句中写return。在异常处理结构中,无论是否发生异常,也无论异常是否被正确捕捉和处理,最后总是要执行finally子句中的代码。如果在函数中异常处理结构的finally子句中return,会发生什么情况呢?

7)不要过于信任异常处理结构,异常处理结构中处理异常的代码也会引发异常,如果用法不对也一样无法避免代码崩溃。例如:




温馨提示

关注本公众号“Python小屋”,通过菜单“最新资源”==>“历史文章”可以快速查看分专题的800篇技术文章列表(可根据关键字在页面上搜索感兴趣的文章),通过“最新资源”==>“微课专区”可以免费观看300节Python微课,通过“最新资源”==>“培训动态”可以查看近期Python培训安排,通过“最新资源”==>“教学资源”可以查看Python教学资源。


--------董付国老师Python系列图书--------

1)《Python程序设计(第2版)》清华大学出版社


2)《Python可以这样学》清华大学出版社


3)《Python程序设计基础(第2版)》清华大学出版社

4)《中学生可以这样学Python》清华大学出版社,配套微课:《中学生可以这样学Python》84节微课免费观看地址


5)《Python程序设计开发宝典》清华大学出版社


6)《玩转Python轻松过二级》清华大学出版社


7) 《Python程序设计基础与应用》机械工业出版社


8)《Python程序设计实验指导书》清华大学出版社


9)《Python编程基础与案例集锦(中学版)》电子工业出版社


《中学生可以这样学Python》84节微课免费观看地址

非计算机专业《Python程序设计基础》教学参考大纲

计算机相关专业“Python程序设计”教学大纲(参考)

《Python程序设计》实验指导书(30个实验)

《Python程序设计基础与应用》课后习题答案

Python课程期末考试编程题自动批卷原理与实现模板

“Python小屋”免费资源汇总(截至2018年11月28日)

Python课堂上我与学生斗智斗勇已8个学期


系列教学PPT:

1900页Python系列PPT分享一:基础知识(106页)

1900页Python系列PPT分享二:Python序列(列表、元组、字典、集合)(154页)

1900页Python系列PPT分享三:选择与循环结构语法及案例(96页)

1900页Python系列PPT分享四:字符串与正则表达式(109页)

1900页Python系列PPT分享五:函数设计与应用(134页)

1900页Python系列PPT分享六:面向对象程序设计(86页)

1900页Python系列PPT分享七:文件操作(132页)

1900页Python系列PPT分享八:异常处理结构与程序调试、测试(70页)

报告PPT(163页):基于Python语言的课程群建设探讨与实践

报告PPT(123页):Python编程基础精要

2000页Python系列PPT分享九:(GUI编程)(122页)

Python实验项目1例:使用进程池统计指定范围内素数的个数

(PPT)Python程序设计课程教学内容组织与教学方法实践


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/31774
 
354 次点击