专栏名称: 36大数据
关注大数据和互联网趋势,最大,最权威,最干货的大数据微信号(dashuju36)。大数据第一科技媒体。不发软文,只做知识分享。
目录
相关文章推荐
大数据文摘  ·  刚刚,OpenAI ... ·  2 天前  
数据派THU  ·  优化注意力层提升 Transformer ... ·  6 天前  
数据派THU  ·  投票 | ... ·  1 周前  
51好读  ›  专栏  ›  36大数据

Python 异常处理完整指南(下)

36大数据  · 公众号  · 大数据  · 2017-05-13 08:44

正文

组织结构

你可以随时随地的定义异常,可以是任意的类,任意的包,函数,甚至是闭包。


很多的库都有他们自己定义的异常模块:SQLAlchemy的异常定义在sqlalchemy.exc中,requests在request.exceptions中,Werkzeug在wekzeug.exceptions中,等等..


这些正常的包都能通过刚才的方法导出异常,同事也能方便的被用户所调用他们的异常模块,并且知道异常在哪里被定义,什么时候来用哪种异常处理代码可能发生的异常。


不过这些都不是强制的,越小的Python模块可能越想把异常整合在他们唯一的模块中。通常如果你的代码小到只有一个文件,就不用非得把代码和异常分成不同的文件或者模块。


当然对于库的明智的选择是,把他们分成不同的文件或者模块。如果每个子系统都有一系列的异常通常就把他们放在这个子系统中。这也是为什么我不推荐一个系统中只放一个异常模块。这样myapp.exceptions就可能没必要了。


例如,如果你的应用已经被一个定义在myapp.http的HTTP REST API所包含,并且他还是一个TCP服务器myapp.tcp的一部分,这样就他们就很可能同事定义不同的异常比如他们自己协议的错误或者消息请求生命周期的错误。如果把这些异常都写在myapp.exceptions里就会破坏代码的一致性,如果异常以诗歌本地文件,就把它们定义在这个文件的头部就好了。这将减缓维护代码的成本。

异常的包裹

包装异常 就是将一个异常封装到另一个异常中: 



当写一个库的时候利用其它库这是有意义的.如果一个库使用了 requests,但他并没将requests异常封装到他自己定义的异常类中, 这会影响异常的传递.任何程序使用你的库可能会收到一个requests.exceptions.ConnectionError,这个问题的因为是:


  1. requests对应用程序来说是透明的,应用程序也不需要/不想知道requests.

  2. 应用程序不得不导入requests.exceptions , 因此它将依赖 requests—即使它不直接使用它.

  3. 一旦我的mylib库从requests 迁移到httplib2, 应用程序中捕获requests异常的代码将会显得多余.



Tooz 库就是封装的很好例子,由于它使用了基于驱动的方法并且依赖许多不同的Python模块与不同的后台服务进行交互 (ZooKeeper, PostgreSQL, 等…). 因此, 它将其它模块的各个场景的异常封装到自己的一组异常类中.Python 3引入了raise from来解决这个问题,Tooz利用它来抛出自己的错误。


就像上面做的那样,将原始异常封装到用户自定义异常中也是可行的.它使得我们可以很方便的查检原始异常.

捕获异常并记录日志

当设计异常时,它应当针对人为因素与电脑因素,记住这很重要.这就是为什么它应该包含明显的消息,并尽可能多的包含信息.这将有助于调试并且编写有弹性的代码,可以依赖异常的属性来观察它的行为,就向上面看到的那样.


完全忽略异常(不做任何处理)应当被认为是不好的编程实践.你不应该写类似那样的代码:



在异常发生的程序中如果没有任何类型的信息,对查找问题来说这就是恶梦.


如果你(应该)使用 logging 库,当有程序发生异常时,你可以使用exc_info参数来记录完整的追踪, 在你调试服务或不可恢复的故障时会变得非常有用:


延伸阅读

到目前为止如果你理解了上述所有内容,恭喜你,你已经做好了处理Python中异常的准备!如果你想有对异常有更多的了解,Python中未提到的部分,我鼓励你阅读条件系统并挖出异常的泛化--我希望我们未来有一天可以在Python中看到。


本文由 負愚侕歸、dreampuff、coyee参与翻译。


Python 异常处理完整指南(上)


 End 



阅读排行榜/精华推荐
1
入门学习

如果有人质疑大数据?不妨把这两个视频转给他 

视频:大数据到底是什么 都说干大数据挣钱 1分钟告诉你都在干什么

人人都需要知道 关于大数据最常见的10个问题

2
进阶修炼

从底层到应用,那些数据人的必备技能

如何高效地学好 R?

一个程序员怎样才算精通Python?

3
数据源爬取/收集

排名前50的开源Web爬虫用于数据挖掘

33款可用来抓数据的开源爬虫软件工具

在中国我们如何收集数据?全球数据收集大教程

4
干货教程

PPT:数据可视化,到底该用什么软件来展示数据?

干货|电信运营商数据价值跨行业运营的现状与思考

大数据分析的集中化之路 建设银行大数据应用实践PPT

【实战PPT】看工商银行如何利用大数据洞察客户心声?              

六步,让你用Excel做出强大漂亮的数据地图

 数据商业的崛起 解密中国大数据第一股——国双

双11剁手幕后的阿里“黑科技” OceanBase/金融云架构/ODPS/dataV

金融行业大数据用户画像实践


讲述大数据在金融、电信、工业、商业、电子商务、网络游戏、移动互联网等多个领域的应用,以中立、客观、专业、可信赖的态度,多层次、多维度地影响着最广泛的大数据人群

36大数据

长按识别二维码,关注36大数据



搜索「36大数据」或输入36dsj.com查看更多内容。


投稿/商务/合作:[email protected]



点击下方“阅读原文”查看更多

↓↓↓