通过实例了解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 import用法以及与from...import的区别
May 28 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 Python
python3连接MySQL数据库实例详解
May 24 Python
基于python生成器封装的协程类
Mar 20 Python
Python求离散序列导数的示例
Jul 10 Python
Django框架之登录后自定义跳转页面的实现方法
Jul 18 Python
Django项目主urls导入应用中views的红线问题解决
Aug 10 Python
django认证系统实现自定义权限管理的方法
Aug 28 Python
如何基于python测量代码运行时间
Dec 25 Python
python爬虫基础知识点整理
Jun 02 Python
python爬虫中抓取指数的实例讲解
Dec 01 Python
Pytorch 统计模型参数量的操作 param.numel()
May 13 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
论建造顺序的重要性
2020/03/04 星际争霸
一个目录遍历函数
2006/10/09 PHP
PHP原生模板引擎 最简单的模板引擎
2012/04/25 PHP
php利用cookie实现自动登录的方法
2014/12/10 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
php中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案
2016/05/31 PHP
IE与FireFox的兼容性问题分析
2007/04/22 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
2013/10/09 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
Jquery 在页面加载后执行的几种方式
2014/03/14 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
详解Vue内部怎样处理props选项的多种写法
2018/11/06 Javascript
react项目如何使用iconfont的方法步骤
2019/03/13 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
Vue自定义全局弹窗组件操作
2020/08/11 Javascript
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
详解 javascript对象创建模式
2020/10/30 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
[43:48]Ti4正赛第一天 VG vs NEWBEE 2
2014/07/19 DOTA
python正则表达式re模块详细介绍
2014/05/29 Python
关于python的list相关知识(推荐)
2017/08/30 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
Gap加拿大官网:Gap Canada
2017/08/24 全球购物
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
在数据文件自动增长时,自动增长是否会阻塞对文件的更新
2014/05/01 面试题
函授教育个人学习的自我评价
2013/12/31 职场文书
煤矿安全协议书
2014/08/20 职场文书
网络营销计划
2015/01/17 职场文书
pytorch中[..., 0]的用法说明
2021/05/20 Python