前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >警惕Python编程中异常处理结构可能的坑

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

作者头像
Python小屋屋主
发布2019-05-05 10:03:58
6040
发布2019-05-05 10:03:58
举报
文章被收录于专栏: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)不要过于信任异常处理结构,异常处理结构中处理异常的代码也会引发异常,如果用法不对也一样无法避免代码崩溃。例如:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档