通过实例了解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实现简单的文件传输与MySQL备份的脚本分享
Jan 03 Python
Python时间的精准正则匹配方法分析
Aug 17 Python
解决Pycharm无法import自己安装的第三方module问题
May 18 Python
浅谈python中拼接路径os.path.join斜杠的问题
Oct 23 Python
Python实现去除列表中重复元素的方法总结【7种方法】
Feb 16 Python
树莓派使用USB摄像头和motion实现监控
Jun 22 Python
python二维码操作:对QRCode和MyQR入门详解
Jun 24 Python
对于Python深浅拷贝的理解
Jul 29 Python
关于Numpy中的行向量和列向量详解
Nov 30 Python
python两种获取剪贴板内容的方法
Nov 06 Python
python 读取串口数据的示例
Nov 09 Python
python利用文件时间批量重命名照片和视频
Feb 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乱码问题
2012/03/25 PHP
基于MySQL分区性能的详细介绍
2013/05/02 PHP
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
Bootstrap Paginator分页插件与ajax相结合实现动态无刷新分页效果
2016/05/27 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
Bootstrap CSS布局之按钮
2016/12/17 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
js实现简单进度条效果
2020/03/25 Javascript
Python爬虫代理IP池实现方法
2017/01/05 Python
Python字符串格式化%s%d%f详解
2018/02/02 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
Go/Python/Erlang编程语言对比分析及示例代码
2018/04/23 Python
python实现串口自动触发工作的示例
2019/07/02 Python
Django model update的多种用法介绍
2020/03/28 Python
Python3 利用face_recognition实现人脸识别的方法
2020/03/13 Python
IE9对HTML5中部分属性不支持的原因分析
2014/10/15 HTML / CSS
加拿大百叶窗和窗帘定制网站:Blinds
2017/01/30 全球购物
校领导推荐信
2013/11/01 职场文书
班组长岗位职责范本
2014/01/05 职场文书
课例研修方案
2014/05/31 职场文书
园林技术专业求职信
2014/07/28 职场文书
小城镇建设汇报材料
2014/08/16 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
2019入党申请书格式和范文
2019/06/25 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL
利用Pycharm连接服务器的全过程记录
2021/07/01 Python
nginx配置限速限流基于内置模块
2022/05/02 Servers
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript