通过实例了解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 相关文章推荐
Python自动化测试工具Splinter简介和使用实例
May 13 Python
python读写ini配置文件方法实例分析
Jun 30 Python
python数据结构之链表详解
Sep 12 Python
python图书管理系统
Apr 05 Python
教你使用python画一朵花送女朋友
Mar 29 Python
Python 3.x基于Xml数据的Http请求方法
Dec 28 Python
使用pygame编写Flappy bird小游戏
Mar 14 Python
Python+PyQt5+MySQL实现天气管理系统
Jun 16 Python
Keras-多输入多输出实例(多任务)
Jun 22 Python
python 6行代码制作月历生成器
Sep 18 Python
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
May 12 Python
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
Jun 08 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
smarty中先strip_tags过滤html标签后truncate截取文章运用
2010/10/25 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
php获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
zend框架实现支持sql server的操作方法
2016/12/08 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
使用百度地图api实现根据地址查询经纬度
2014/12/11 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
Angular.js前台传list数组由后台spring MVC接收数组示例代码
2017/07/31 Javascript
老生常谈javascript的面向对象思想
2017/08/22 Javascript
Vue基于NUXT的SSR详解
2017/10/24 Javascript
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
JavaScript事件委托实现原理及优点进行
2020/08/29 Javascript
[00:02]DOTA2新版本使用PA至宝后暴击展示
2014/11/19 DOTA
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
python获取外网IP并发邮件的实现方法
2017/10/01 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
利用python循环创建多个文件的方法
2018/10/25 Python
Python面向对象实现一个对象调用另一个对象操作示例
2019/04/08 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
2020/09/28 Python
德国隐形眼镜店:LuckyLens
2018/07/29 全球购物
乡镇纠风工作实施方案
2014/03/22 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
送温暖献爱心活动总结
2014/07/08 职场文书
文明社区申报材料
2014/08/21 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
2014年社区党建工作总结
2014/11/11 职场文书
导游词之阳朔遇龙河
2019/12/16 职场文书