专栏名称: 36大数据
关注大数据和互联网趋势,最大,最权威,最干货的大数据微信号(dashuju36)。大数据第一科技媒体。不发软文,只做知识分享。
目录
相关文章推荐
软件定义世界(SDX)  ·  中小企业数字化建设的路径与方法 ·  3 天前  
山东高速信息集团有限公司  ·  信息集团入选济南市首批公共数据授权运营单位 ·  3 天前  
山东高速信息集团有限公司  ·  信息集团入选济南市首批公共数据授权运营单位 ·  3 天前  
数据派THU  ·  2024大数据挑战赛全国六强团队获奖经验+p ... ·  6 天前  
51好读  ›  专栏  ›  36大数据

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

36大数据  · 公众号  · 大数据  · 2017-05-09 06:20

正文

3年前我写了一篇文章 Python classic, static, class and abstract methods,现在似乎到了更新的时候,今天我想来剖析和讨论 Python 异常。


剖析异常基础类


Python 异常的基础类名为 BaseException。这个类在程序和库中很少用,更多时候它被当成是异常的实现细节。为了了解异常是怎么实现的,我们可以阅读 CPython 源码中的 Objects/exceptions.c 文件。在这个文件中你可以看到 BaseException 类中定义的所有基础方法和异常的属性。而我们常用的 Exception 类则继承于 BaseException,该类只包含如下代码:



另外一些直接继承 BaseException 的类是 GeneratorExit、SystemExit 和 KeyboardInterrupt。而其他内置的异常一般直接从 Exception 类中继承。你可以通过 pydoc2 exceptions 或者 pydoc3 builtins 命令来查看整个异常的结构。

这里是在 Python 2 和 3 中通过这个 脚本 生成的内置异常继承结构图。 


https://coyee.com/uploads/img/20160813/111701_AtY7.png(查看大图)


https://coyee.com/uploads/img/20160813/111702_OPKJ.png(查看大图)


BaseException.__init__ 签名是BaseException.__init__(*args)。这个初始化方法保存了许多参数,都传入到的args属性上。 从exceptions.c 的源代码中可以看出这一点,在Python2 与Python3中都是这样的:

只有BaseException.__str__ 方法用到了args 属性。这个方法使用self.args将异常转换为字符串:

上面的代码转换为 Python是这样的:

因此,异常信息应该被当作唯一一个参数传入给 BaseException.__init__ 方法。


正确的定义异常类


正如你可能已经知道了,在Python中,异常有可能在任何地方被抛出。最基本的异常类叫Exception ,它可用于程序的任何地方。在编码中,没有程序或库直接抛出Exception -这对我们来说还不够。


自从将所有的异常设计为都继承这个顶级的 Exception类,这个类可以很方便的用于捕获所有异常:

为了合理准确的定义你的异常类,这里有一些规范与编程技巧,你可以做为参照:


必须继承 Exception类: 

class MyOwnError(Exception):

    pass


利用前面提到的BaseException.__str__: 它将传递给BaseException.__init__ 方法的第一个参数打印出来,所以通常在调用 BaseException.__init__ 方法时,只传递一个参数 .


当创建类库时,可以定义一个继承于Exception的基类.客户在使用类库时,会更方便的捕捉任何异常:



在编写任何关于shose的代码时,这段代码将会很有用,除了ShoeError.例如,Django 对异常并没有拆分的很细,这导致我们很难捕获 "Django抛出的任何异常".


提供关于异常的详细信息.这是很有价值的,它可以正确的记录日志,做进一步操作甚至恢复:


然后,任何代码都可以检查异常,并根据异常做进一步处理: 

例如,这里检测到违反SQL外键约束时,利用 Gnocchi 抛出特定的应用程序异常(NoSuchArchivePolicy): 

在需要的时候继承内置的异常类型.这将使编程变得更方便,不需要为你的程序或类库编写特定的异常:

这将允许更多程序在不知道你定义的异常类型情况下,使用通用方式来捕获异常.如果一个程序知道如何处理ValueError, 它将不需要任何特定的代码或修改。


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




 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]



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

↓↓↓