通过实例了解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装饰器在Django框架下去除冗余代码的教程
Apr 16 Python
python计算对角线有理函数插值的方法
May 07 Python
Python基于回溯法子集树模板解决0-1背包问题实例
Sep 02 Python
浅析Git版本控制器使用
Dec 10 Python
pygame游戏之旅 添加游戏介绍
Nov 20 Python
Python3利用print输出带颜色的彩色字体示例代码
Apr 08 Python
使用PyQt4 设置TextEdit背景的方法
Jun 14 Python
jupyter notebook 添加kernel permission denied的操作
Apr 21 Python
Python基于network模块制作电影人物关系图
Jun 19 Python
Python爬虫新手入门之初学lxml库
Dec 20 Python
理解python中装饰器的作用
Jul 21 Python
Python实现日志实时监测的示例详解
Apr 06 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 include的妙用,实现路径加密
2008/07/29 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
2014/11/17 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
PHP 文件上传限制问题
2019/09/01 PHP
jquery实现动态菜单的实例代码
2013/11/28 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
2015/09/30 Javascript
用js实现简单算法的实例代码
2016/09/24 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
nodejs对express中next函数的一些理解
2017/09/08 NodeJs
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
vue瀑布流组件实现上拉加载更多
2020/03/10 Javascript
JavaScript实现放大镜效果代码示例
2020/04/29 Javascript
javascript实现贪吃蛇小练习
2020/07/05 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
[46:02]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第二局
2016/02/28 DOTA
解决Python requests 报错方法集锦
2017/03/19 Python
Python实现京东秒杀功能代码
2019/05/16 Python
Django中使用 Closure Table 储存无限分级数据
2019/06/06 Python
Python利用WMI实现ping命令的例子
2019/08/14 Python
如何基于python生成list的所有的子集
2019/11/11 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
python实现马丁策略的实例详解
2021/01/15 Python
CSS3实现可爱的小黄人动画
2016/07/11 HTML / CSS
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
会计专业应届生求职信
2013/11/24 职场文书
建筑工程专业大学生求职信
2014/04/23 职场文书
2014年节能工作总结
2014/12/18 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
python对文档中元素删除,替换操作
2022/04/02 Python
Spring Boot实现文件上传下载
2022/08/14 Java/Android