Python异常处理机制结构实例解析


Posted in Python onJuly 23, 2020

首先,Python 完整的异常处理语法结构如下:

try:
  #业务实现代码
except Exception1 as e:
  #异常处理块1
  ...
except Exception2 as e:
  #异常处理块2
  ...
#可以有多个 except
...
else:
  #正常处理块
finally :
  #资源回收块
  ...

整个异常处理结构的执行过程,如图 1 所示。

Python异常处理机制结构实例解析

注意,在整个异常处理结构中,只有 try 块是必需的,也就是说:

  • 如果没有 try 块,则不能有后面的 except 块、else 块和 finally 块。但是也不能只使用 try 块,要么使用 try except 结构,要么使用 try finally 结构;
  • except 块、else 块、finally 块都是可选的,当然也可以同时出现;
  • 可以有多个 except 块,但捕获父类异常的 except 块应该位于捕获子类异常的 except 块的后面;
  • 多个 except 块必须位于 try 块之后,finally 块必须位于所有的 except 块之后。
  • 要使用 else 块,其前面必须包含 try 和 except。

其中,很多初学者分不清 finally 和 else 的区别,这里着重说一下。else 语句块只有在没有异常发生的情况下才会执行,而 finally 语句则不管异常是否发生都会执行。不仅如此,无论是正常退出、遇到异常退出,还是通过 break、continue、return 语句退出,finally 语句块都会执行。

注意,如果程序中运行了强制退出 Python 解释器的语句(如 os._exit(1) ),则 finally 语句将无法得到执行。例如:

import os
try:
  os._exit(1)
finally:
  print("执行finally语句")

运行程序,没有任何输出。因此,除非在 try 块、except 块中调用了退出 Python 解释器的方法,否则不管在 try 块、except 块中执行怎样的代码,出现怎样的情况,异常处理的 finally 块总会被执行。

另外在通常情况下,不要在 finally 块中使用如 return 或 raise 等导致方法中止的语句(raise 语句将在后面介绍),一旦在 finally 块中使用了 return 或 raise 语句,将会导致 try 块、except 块中的 return、raise 语句失效。看如下程序:

def test():
  try:
    # 因为finally块中包含了return语句
    # 所以下面的return语句失去作用
    return True
  finally:
    return False
print(test())

上面程序在 finally 块中定义了一条 return False 语句,这将导致 try 块中的 return true 失去作用。运行上面程序,输出结果为:

False

同样,如果 Python 程序在执行 try 块、except 块包含有 return 或 raise 语句,则 Python 解释器执行到该语句时,会先去查找 finally 块,如果没有 finally 块,程序才会立即执行 return 或 raise 语句;反之,如果找到 finally 块,系统立即开始执行 finally 块,只有当 finally 块执行完成后,系统才会再次跳回来执行 try 块、except 块里的 return 或 raise 语句。

但是,如果在 finally 块里也使用了 return 或 raise 等导致方法中止的语句,finally 块己经中止了方法,系统将不会跳回去执行 try 块、except 块里的任何代码。

尽量避免在 finally 块里使用 return 或 raise 等导致方法中止的语句,否则可能出现一些很奇怪的情况。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用PyCharm配合部署Python的Django框架的配置纪实
Nov 19 Python
python处理Excel xlrd的简单使用
Sep 12 Python
Python检测网络延迟的代码
May 15 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
Jun 13 Python
Python图像处理PIL各模块详细介绍(推荐)
Jul 17 Python
基于Python的图像数据增强Data Augmentation解析
Aug 13 Python
python并发编程多进程 互斥锁原理解析
Aug 20 Python
Python绘制热力图示例
Sep 27 Python
Python中如何将一个类方法变为多个方法
Dec 30 Python
Python中Yield的基本用法
Oct 18 Python
Python文件的操作示例的详细讲解
Apr 08 Python
Django对接elasticsearch实现全文检索的示例代码
Aug 02 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
快速解释如何使用pandas的inplace参数的使用
Jul 23 #Python
You might like
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
phpmyadmin MySQL 加密配置方法
2009/07/05 PHP
php 文章采集正则代码
2009/12/28 PHP
php 使用file_get_contents读取大文件的方法
2014/11/13 PHP
php实现简单文件下载的方法
2015/01/30 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
2016/09/30 PHP
js代码验证手机号码和电话号码是否合法
2015/07/30 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
jQuery基本筛选选择器实例代码
2017/02/06 Javascript
详解ECMAScript6入门--Class对象
2017/04/27 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
vue router+vuex实现首页登录验证判断逻辑
2018/05/17 Javascript
微信小程序实现多个按钮的颜色状态转换
2019/02/15 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
ES6 十大特性简介
2020/12/09 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
django之跨表查询及添加记录的示例代码
2018/10/16 Python
Python read函数按字节(字符)读取文件的实现
2019/07/03 Python
简单了解Django ContentType内置组件
2019/07/23 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
Python自动发送和收取邮件的方法
2020/08/12 Python
css3 矩阵的使用详解
2018/03/20 HTML / CSS
浅谈Html5中视频 音频标签 进度条的问题
2016/07/26 HTML / CSS
Allsole美国/加拿大:英国一家专门出售品牌鞋子的网站
2018/10/21 全球购物
硕士研究生就业推荐信
2014/05/18 职场文书
关于感恩的演讲稿800字
2014/08/26 职场文书
股份合作协议书
2014/09/10 职场文书
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
公司员工离职证明书
2014/10/04 职场文书
2015少先队大队辅导员工作总结
2015/07/24 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
2016年感恩节活动总结大全
2016/04/01 职场文书
goland 设置project gopath的操作
2021/05/06 Golang
python编程项目中线上问题排查与解决
2021/11/01 Python
Vue全局事件总线你了解吗
2022/02/24 Vue.js
Android studio 简单计算器的编写
2022/05/20 Java/Android