通过实例了解Python异常处理机制底层实现


Posted in Python onJuly 23, 2020

要了解try except异常处理的用法,简单来说,当位于 try 块中的程序执行出现异常时,会将该种异常捕获,同时找到对应的 except 块处理该异常,那么这里就有一个问题,它是如何找到对应的 except 块的呢?

我们知道,一个 try 块也可以对应多个 except 块,一个 except 块可以同时处理多种异常。如果我们想使用一个 except 块处理所有异常,就可以这样写:

try: #...except Exception: #...

这种情况下,对于 try 块中可能出现的任何异常,Python解释器都会交给仅有的这个 except 块处理,因为它的参数是 Exception,表示可以接收任何类型的异常。

注意,对于可以接收任何异常的 except 来说,其后可以跟 Exception,也可以不跟任何参数,但表示的含义都是一样的。

这里就要详细介绍一下 Exception。要知道,为了表示程序中可能出现的各种异常,Python 提供了大量的异常类,这些异常类之间有严格的继承关系,图 1 显示了 Python 的常见异常类之间的继承关系。

通过实例了解Python异常处理机制底层实现

从图 1 中可以看出,BaseException 是Python 中所有异常类的基类,但对于我们来说,最主要的是Exception 类,因为程序中可能出现的各种异常,都继承自 Exception。

因此,如果用户要实现自定义异常,不应该继承 BaseException ,而应该继承 Exception 类。关于如何自定义一个异常类,可阅读《Python自定义异常类》一节。

当 try 块捕获到异常对象后,Python 解释器会拿这个异常类型依次和各个 except 块指定的异常类进行比较,如果捕获到的这个异常类,和某个 except 块后的异常类一样,又或者是该异常类的子类,那么 Python 解释器就会调用这个 except 块来处理异常;反之,Python 解释器会继续比较,直到和最后一个 except 比较完,如果没有比对成功,则证明该异常无法处理。

图 2 演示了位于 try 块中的程序发生异常时,从捕获异常到处理异常的整个流程。

通过实例了解Python异常处理机制底层实现

下面看几个简单的异常捕获的例子:

try:
  a = int(input("输入 a:"))
  b = int(input("输入 b:"))
  print( a/b )
except ValueError:
  print("数值错误:程序只能接收整数参数")
except ArithmeticError:
  print("算术错误")
except Exception:
  print("未知异常")

该程序中,根据用户输入 a 和 b 值的不同,可能会导致 ValueError、ArithmeticError 异常:

  • 如果用户输入的 a 或者 b 是其他字符,而不是数字,会发生 ValueError 异常,try 块会捕获到该类型异常,同时 Python 解释器会调用第一个 except 块处理异常;
  • 如果用户输入的 a 和 b 是数字,但 b 的值为 0,由于在进行除法运算时除数不能为 0,因此会发生 ArithmeticError 异常,try 块会捕获该异常,同时 Python 解释器会调用第二个 except 块处理异常;
  • 当然,程序运行过程中,还可能由于其他因素出现异常,try 块都可以捕获,同时 Python 会调用最后一个 except 块来处理。

当一个 try 块配有多个 except 块时,这些 except 块应遵循这样一个排序规则,即可处理全部异常的 except 块(参数为 Exception,也可以什么都不写)要放到所有 except 块的后面,且所有父类异常的 except 块要放到子类异常的 except 块的后面。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Gnumeric下使用Python脚本操作表格的教程
Apr 14 Python
快速查询Python文档方法分享
Dec 27 Python
python中协程实现TCP连接的实例分析
Oct 14 Python
Python3 jupyter notebook 服务器搭建过程
Nov 30 Python
python实现控制台打印的方法
Jan 12 Python
Python中文编码知识点
Feb 18 Python
Python3实现mysql连接和数据框的形成(实例代码)
Jan 17 Python
Python模块相关知识点小结
Mar 09 Python
Python格式化输出--%s,%d,%f的代码解析
Apr 29 Python
Python基于codecs模块实现文件读写案例解析
May 11 Python
Python logging模块进行封装实现原理解析
Aug 07 Python
matplotlib基础绘图命令之imshow的使用
Aug 13 Python
Python异常处理机制结构实例解析
Jul 23 #Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
Jul 23 #Python
Python字符串函数strip()原理及用法详解
Jul 23 #Python
Python使用sys.exc_info()方法获取异常信息
Jul 23 #Python
Python中Selenium库使用教程详解
Jul 23 #Python
Python基于traceback模块获取异常信息
Jul 23 #Python
Python TestSuite生成测试报告过程解析
Jul 23 #Python
You might like
php基础知识:类与对象(3) 构造函数和析构函数
2006/12/13 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
扩展jquery实现客户端表格的分页、排序功能代码
2011/03/16 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
2011/12/11 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
Jquery submit()无法提交问题
2013/04/21 Javascript
jquery控制display属性为none或block
2014/03/31 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
jQuery实现6位数字密码输入框
2016/12/29 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
2017/01/05 Javascript
jQuery弹出层插件popShow用法示例
2017/01/23 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
动态加载权限管理模块中的Vue组件
2018/01/16 Javascript
使用FileReader API创建Vue文件阅读器组件
2018/04/03 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
js实现图片局部放大效果详解
2019/03/18 Javascript
[02:17]快乐加倍!DOTA2食人魔魔法师至宝+迎霜节活动上线
2019/12/22 DOTA
python操作sqlite的CRUD实例分析
2015/05/08 Python
Python3中的真除和Floor除法用法分析
2016/03/16 Python
Python2.7读取PDF文件的方法示例
2017/07/13 Python
python脚本作为Windows服务启动代码详解
2018/02/11 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
2018/04/26 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
2018/06/13 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
详解python项目实战:模拟登陆CSDN
2019/04/04 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
基于python的列表list和集合set操作
2019/11/24 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
canvas与html5实现视频截图功能示例
2016/12/15 HTML / CSS
Converse匡威法国官网:美国著名帆布鞋品牌
2018/12/05 全球购物
介绍一下Cookie和Session及他们之间的区别
2012/11/20 面试题