第14条:尽量用异常来表示特殊情况,而不要返回Nono
核心知识点:
1.用None这个返回值来表示特殊意义的函数,很容易使调用者犯错,因为None和0以及空字符串之类的值,在条件表达式里都会评估为False。
2.两种方法:二元法;将异常抛给上一级直接报错。
编写工具函数(utility function)时,我们有时候喜欢给None这个返回值赋予特殊意义,有时候这么做是合理地,有时候就会出错。
例如要编写辅助函数,计算两数相除的商,在除数为0的情况下,计算结果是没有明确含义的,所以似乎应该返回None,就像下面这样:
In [1]: def divide(a,b):
...: try:
...: return a / b
...: except ZeroDivisionError:
...: return None
...:
#貌似没有什么问题
#执行几次试试
In [2]: divide(1,2)
Out[2]: 0.5 In [3]: divide(1,0) In [4]: divide(0,1)
Out[4]: 0.0
貌似是没有什么问题,但是当在if语句中拿这个计算结果做判断时,会出现问题。
我们可能不会专门去判断函数的返回值是否为None,而是:只要返回与False等效的运算结果,就说明函数出错了。
这样明显有漏洞,当a=0,函数没有报错,但是按照上面的逻辑却是会报错。
如果None这个返回值,对函数有特殊意义(在上面的例子中,None的特殊意义就是异常),那么在编写Python代码时,就很容易犯上面这种错误。
有两种方法可以减少这种错误:
第一种方法,是把返回值拆成两部分,并放到二元组(two-tuple)里面。二元组的首个元素表示操作是否成功,接下来的那个元素,才是真正的运算结果。
In [9]: def divide(a,b):
...: try:
...: return True,a / b
...: except ZeroDivisionError:
...: return False, None
...: In [10]: divide(1,0)
Out[10]: (False, None) In [11]: divide(0,1)
Out[11]: (True, 0.0)
调用该函数的人需要解析这个元祖。这就使得不能只根据结果来遐想了,而必须根据运算状态的那个元素来做判断。
第二种办法更好一些,那就是根本不返回None,而是把异常把异常抛给上一级,使得调用者必须应对它。
In [13]: def divide(a,b):
...: try:
...: return a / b
...: except ZeroDivisionError as e:
...: raise ValueError('Invalid inputs') from e
...:
调用者需要处理因输入值无效而引发的异常。
调用者无需用条件语句来判断函数的返回值,因为如果函数没有抛出异常,返回值自然就是正确的,这样写出来的异常处理代码,也比较清晰。
第14条:尽量用异常来表示特殊情况,而不要返回Nono的更多相关文章
- web前端性能14条规则
14条规则 1.减少Http请求 使用图片地图 使用CSS Sprites 合并JS和CSS文件 这个是由于浏览器对同一个host有并行下载的限制,http请求越多,总体下载速度越慢 2.使用CDN( ...
- 雅虎Yahoo 前段优化 14条军规
Yahoo 14条 雅虎十四条 腾讯前端设计的Leader推荐我背熟的.请大家都能好好学习,不要像我一样一扫而过,好好的记下来!不仅仅是晓得一些CSS xhtml就好了,深刻认识到很多的东西需要学习的 ...
- 对ios、android开发程序员的14条忠告
————————本文摘自千锋教育(http://www.mobiletrain.org/)对ios\android开发程序员的14条忠告————————— 1.不要害怕在工作中学习. 只要有电脑,就可 ...
- [译] MVP模式的14条规则
笔者在前文<MVP和MVC>中提到了两者的区别,以及MVP日趋流行的原因:即随着各种给力UI框架的发布,View的功能越来越强,已经足以完成一些简单的不需要与后台或其他view交互的eve ...
- 14条最佳JS代码编写技巧
http://gaohaixian.blog.163.com/blog/static/123260105201142645458315/写任何编程代码,不同的开发者都会有不同的见解.但参考一下总是好的 ...
- DIV+CSS常见问题的14条原因分析
当你在一个浏览器里面做好,在其他浏览器里面却完全不是那么回事情. 很多时候,我们就只是去修补下,或者利用各个浏览器对代码支持的不一致,进行针对各个浏览器进行不同的定义. 其实浏览器的不兼容,我们往 ...
- autowire异常的三个情况
2010-3-11 16:06:00 net.sf.ehcache.config.ConfigurationFactory parseConfiguration 警告: No configuratio ...
- YaHoo Web优化的14条法则
Web应用性能优化黄金法则:先优化前端程序(front-end)的性能,因为这是80%或以上的最终用户响应时间的花费所在. 法则1. 减少HTTP请求次数 80%的最终用户响应时间花在前端程序上,而其 ...
- 【php】页面加载优化的14条原则
1. 尽可能的减少 HTTP 的请求数 [content] 2. 使用 CDN(Content Delivery Network) [server] 3. 添加 Expires 头(或者 Cach ...
随机推荐
- 控制器View是怎样创建的?
对于非常多程序猿来说控制器和View的关系肯定有点模糊,对于View的创建肯定有一种说不清道不明的感觉.view仅仅是控制器的一个属性.控制器中有很多对view处理的方法.也就是说得控制器管理view ...
- iOS使用自己定义字体
1.加入相应的字体(.ttf或.odf)到project的resurce,比如my.ttf. 2.在info.plist中加入一项 Fonts provided by application (ite ...
- TCP/IP详解 卷一(第十九章 TCP的交互数据流)
TCP需要同时处理两类数据:块数据.交互数据. 本章将以Rlogin应用为例观察交互数据的传输过程. 交互式输入 首先观察在一个Rlogin连接上键入一个交互命令时所产生的数据流(每键入一个交互按键都 ...
- <转>Windows平台下Makefile学习笔记(一)
本文转自:http://blog.csdn.net/clever101/article/details/8147352 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发 ...
- libpointmatcher的filter
Maximum Density Filter Points are only considered for rejection if they exceed a density threshold, ...
- Manifest.xml中删除了『存储/修改删除SD卡中的内容』和『手机通话/读取手机状态和身份』权限,但生成apk安装软件时仍提示 允许应用程序了解或使用这两个权限
原因:Android系统会给targetSdk版本为“4”以下的应用自动分配WRITE_EXTERNAL_STORAGE 和 READ_PHONE_STATE 权限. 解放办法:在manifest.x ...
- Git(四):理解和使用分支
分支是Git的核心内容之中的一个,本章将介绍分支的一些知识,这里将继续使用前面创建的版本号库. 假设你跳过了前面章节直接进入本章.能够从Github上克隆这个版本号库: $ git clon ...
- 使用新版MonoDevelop来进行unity工程调试
现在可以使用新版的MonoDeveloper来调试Unity工程了,新版的MonoDeveloper界面上漂亮很多,而且使用.调试上感觉也更舒服了.先上一张图: 安装方法如下: 登陆网址:http ...
- Android SDK环境搭建
方法有二 方法一: Android SDK开发包国内下载地址 http://www.cnblogs.com/bjzhanghao/archive/2012/11/14/android-platform ...
- RocketMQ 4.3正式发布,支持分布式事务
冯嘉 作者 | 冯嘉 近日,Apache RocketMQ 4.3 版本宣布发布,此次发布不仅包括提升性能,减少内存使用等原有特性增强,还修复了部分社区提出的若干问题,更重要的是该版本开源了社 ...