通过实例了解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从ftp下载数据保存实例
Nov 20 Python
在Python的Django框架中创建和使用模版
Jul 15 Python
Python文件和流(实例讲解)
Sep 12 Python
深入浅析python 中的匿名函数
May 21 Python
详解Numpy中的广播原则/机制
Sep 20 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
Jun 27 Python
matlab灰度图像调整及imadjust函数的用法详解
Feb 27 Python
在Keras中利用np.random.shuffle()打乱数据集实例
Jun 15 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
Jul 14 Python
Python如何定义接口和抽象类
Jul 28 Python
详解pandas赋值失败问题解决
Nov 29 Python
图文详解matlab原始处理图像几何变换
Jul 09 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应用程序来获取Web服务器的状态信息
2006/10/09 PHP
实现“上一页”和“下一页按钮
2006/10/09 PHP
PHP实现MVC开发得最简单的方法――模型
2007/04/10 PHP
在Linux系统下一键重新安装WordPress的脚本示例
2015/06/30 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
PHP基于mcript扩展实现对称加密功能示例
2019/02/21 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
2019/10/20 PHP
表单(FORM)的一些实用效果代码
2007/03/25 Javascript
Node.js中的事件驱动编程详解
2014/08/16 Javascript
解决bootstrap中modal遇到Esc键无法关闭页面
2015/03/09 Javascript
深入探讨javascript函数式编程
2015/10/11 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
vue响应式系统之observe、watcher、dep的源码解析
2019/04/09 Javascript
vue.js封装switch开关组件的操作
2020/10/26 Javascript
[04:32]玩具屠夫中文语音节选
2020/08/23 DOTA
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
python机器学习案例教程——K最近邻算法的实现
2017/12/28 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
2019/06/18 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
CSS3 实现的加载动画
2020/12/07 HTML / CSS
Html5移动端适配IphoneX等机型的方法
2019/06/25 HTML / CSS
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
企业宣传方案
2014/03/04 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
周一问候语大全
2015/11/10 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书
PostgreSQL将数据加载到buffer cache中操作方法
2021/04/16 PostgreSQL
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server