通过实例了解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中用Descriptor实现类级属性(Property)详解
Sep 18 Python
Python的类实例属性访问规则探讨
Jan 30 Python
Python实现的数据结构与算法之基本搜索详解
Apr 22 Python
Python二进制串转换为通用字符串的方法
Jul 23 Python
利用Django-environ如何区分不同环境
Aug 26 Python
对python中类的继承与方法重写介绍
Jan 20 Python
解决python 上传图片限制格式问题
Oct 30 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
Jan 07 Python
Spring http服务远程调用实现过程解析
Jun 11 Python
Python dict的常用方法示例代码
Jun 23 Python
python向企业微信发送文字和图片消息的示例
Sep 28 Python
基于tensorflow权重文件的解读
May 26 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获取数组的键与值方法小结
2015/06/13 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
javascript 使用for循环时该注意的问题-附问题总结
2015/08/19 Javascript
checkbox 选中一个另一个checkbox也会选中的实现代码
2016/07/09 Javascript
深入浅出 jQuery中的事件机制
2016/08/23 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
小程序组件之仿微信通讯录的实现代码
2018/09/12 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
vue实现商城秒杀倒计时功能
2019/12/12 Javascript
javascript实现超好看的3D烟花特效
2020/01/01 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
vue实现树状表格效果
2020/12/29 Vue.js
[01:06:07]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS CIS
2014/05/22 DOTA
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
[42:23]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第二场 12.10
2020/12/13 DOTA
python链接Oracle数据库的方法
2015/06/28 Python
python opencv检测目标颜色的实例讲解
2018/04/02 Python
python 读取txt中每行数据,并且保存到excel中的实例
2018/04/29 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
2020/05/16 Python
python线程里哪种模块比较适合
2020/08/02 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
CSS3绘制不规则图形的一些方法示例
2015/11/07 HTML / CSS
早读迟到检讨书
2014/01/24 职场文书
青年志愿者服务活动总结
2015/05/06 职场文书
校车安全管理责任书
2015/05/11 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server
JS实现扫雷项目总结
2021/05/19 Javascript
win10搭建配置ftp服务器的方法
2022/08/05 Servers