通过实例了解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 相关文章推荐
Django URL传递参数的方法总结
Aug 28 Python
Python socket网络编程TCP/IP服务器与客户端通信
Jan 05 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
Jan 20 Python
Python部署web开发程序的几种方法
May 05 Python
利用pandas进行大文件计数处理的方法
Jul 25 Python
pyqt5 使用label控件实时显示时间的实例
Jun 14 Python
django框架用户权限中的session缓存到redis中的方法
Aug 06 Python
Python利用PyExecJS库执行JS函数的案例分析
Dec 18 Python
Django 解决model 反向引用中的related_name问题
May 19 Python
k-means 聚类算法与Python实现代码
Jun 01 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
Python进程池与进程锁之语法学习
Apr 11 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 输出简单动态WAP页面
2009/06/09 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
2014/10/20 PHP
php简单防盗链实现方法
2015/07/29 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
jQuery中校验时间格式的正则表达式小结
2013/09/22 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
javascript(js)的小数点乘法除法问题详解
2014/03/07 Javascript
js 获取元素下面所有li的两种方法
2014/04/14 Javascript
JavaScript 学习笔记之数据类型
2015/01/14 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
vue实现百度搜索功能
2020/12/28 Javascript
javascript简单实现深浅拷贝过程详解
2019/10/08 Javascript
[48:53]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第一场
2014/05/26 DOTA
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
Python TestCase中的断言方法介绍
2019/05/02 Python
代码总结Python2 和 Python3 字符串的区别
2020/01/28 Python
Python基于pandas爬取网页表格数据
2020/05/11 Python
Python爬虫之Selenium鼠标事件的实现
2020/12/04 Python
CSS3 实用技巧:实现黑白图像效果示例代码
2013/07/11 HTML / CSS
纯css3实现的动画按钮的实例教程
2014/11/17 HTML / CSS
毕业学生推荐信
2013/12/01 职场文书
高中毕业生生活的自我评价
2013/12/08 职场文书
教师应聘自荐信范文
2014/03/14 职场文书
社区交通安全实施方案
2014/03/22 职场文书
网球场地租赁协议范本
2014/10/07 职场文书
同意报考证明
2015/06/17 职场文书
纪检部部长竞选稿
2015/11/21 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
一条 SQL 语句执行过程
2022/03/17 MySQL
Python使用openpyxl模块处理Excel文件
2022/06/05 Python