通过实例了解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 http接口自动化脚本详解
Jan 02 Python
python如何通过twisted实现数据库异步插入
Mar 20 Python
Python unittest单元测试框架总结
Sep 08 Python
python中使用 xlwt 操作excel的常见方法与问题
Jan 13 Python
对Pycharm创建py文件时自定义头部模板的方法详解
Feb 12 Python
python从list列表中选出一个数和其对应的坐标方法
Jul 20 Python
python字典的setdefault的巧妙用法
Aug 07 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
Feb 09 Python
python中setuptools的作用是什么
Jun 19 Python
Python是怎样处理json模块的
Jul 16 Python
python实现mask矩阵示例(根据列表所给元素)
Jul 30 Python
Python2.6版本pip安装步骤解析
Aug 17 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 $_SERVER["REQUEST_URI"]获取值的通用解决方法
2010/06/21 PHP
php中一个有意思的日期逻辑处理
2012/03/25 PHP
提高PHP编程效率的方法
2013/11/07 PHP
PHP bin2hex()函数基础实例讲解
2019/02/11 PHP
laravel通用化的CURD的实现
2019/12/13 PHP
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
jquery实现submit提交表单
2015/02/03 Javascript
JavaScipt选取文档元素的方法(推荐)
2016/08/05 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
在NPM发布自己造的轮子的方法步骤
2019/03/09 Javascript
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
angular 服务随记小结
2019/05/06 Javascript
浅析js实现网页截图的两种方式
2019/11/01 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
详解Python中使用base64模块来处理base64编码的方法
2016/07/01 Python
python写一个md5解密器示例
2018/02/23 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
Sephora丝芙兰马来西亚官方网站:国际化妆品购物
2018/03/15 全球购物
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
新加坡一家在线男士皮具品牌:Faire Leather Co.
2019/12/01 全球购物
经理管理专业毕业自荐书范文
2014/02/12 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
计划生育工作总结2015
2015/04/03 职场文书
学术研讨会主持词
2015/07/04 职场文书
高中生综合素质评价范文
2015/08/18 职场文书
给校长的建议书作文300字
2015/09/14 职场文书
婚礼男方父母答谢词
2015/09/29 职场文书
《陶罐和铁罐》教学反思
2016/03/03 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers