通过实例了解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关闭windows进程的方法
Apr 18 Python
python在ubuntu中的几种安装方法(小结)
Dec 08 Python
Python简单生成随机数的方法示例
Mar 31 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 Python
Python脚本利用adb进行手机控制的方法
Jul 08 Python
Django中多种重定向方法使用详解
Jul 17 Python
python SocketServer源码深入解读
Sep 17 Python
python 将dicom图片转换成jpg图片的实例
Jan 13 Python
python numpy--数组的组合和分割实例
Feb 24 Python
如何创建一个Flask项目并进行简单配置
Nov 18 Python
python爬取微博评论的实例讲解
Jan 15 Python
Python制作运行进度条的实现效果(代码运行不无聊)
Feb 24 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 checkbox 取值详细说明
2010/08/19 PHP
用php来改写404错误页让你的页面更友好
2013/01/24 PHP
PHP中操作ini配置文件的方法
2013/04/25 PHP
php+ajax实时刷新简单实例
2015/02/25 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
让Laravel API永远返回JSON格式响应的方法示例
2018/09/05 PHP
JavaScript的目的分析
2007/01/05 Javascript
Javascript读取cookie函数代码
2010/10/16 Javascript
解析JavaScript中instanceof对于不同的构造器或许都返回true
2013/12/03 Javascript
jQuery实现拖拽效果插件的方法
2015/03/23 Javascript
js限制input标签中只能输入中文
2015/06/26 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
2016/03/29 Javascript
js中常用的Tab切换效果(推荐)
2016/08/30 Javascript
Three.js实现简单3D房间布局
2018/12/30 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
JavaScript计算出两个数的差值
2020/03/19 Javascript
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
Python中使用多进程来实现并行处理的方法小结
2017/08/09 Python
浅析Python装饰器以及装饰器模式
2018/05/28 Python
pandas进行数据的交集与并集方式的数据合并方法
2018/06/27 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
python递归下载文件夹下所有文件
2019/08/31 Python
python 双循环遍历list 变量判断代码
2020/05/04 Python
keras topN显示,自编写代码案例
2020/07/03 Python
局火灾防控工作方案
2014/05/25 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
水电工岗位职责
2015/02/14 职场文书
初中军训感想
2015/08/07 职场文书
MySQL入门命令之函数-单行函数-流程控制函数
2021/04/05 MySQL
JavaScript执行机制详细介绍
2021/12/06 Javascript
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python
Golang MatrixOne使用介绍和汇编语法
2022/04/19 Golang