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 相关文章推荐
Python中的迭代器漫谈
Feb 03 Python
Python可跨平台实现获取按键的方法
Mar 05 Python
python动态网页批量爬取
Feb 14 Python
matplotlib subplots 设置总图的标题方法
May 25 Python
用Python PIL实现几个简单的图片特效
Jan 18 Python
python实现小球弹跳效果
May 10 Python
Python 取numpy数组的某几行某几列方法
Oct 24 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
Jan 08 Python
Django 实现对已存在的model进行更改
Mar 28 Python
基于Python的Jenkins的二次开发操作
May 12 Python
基于Python和C++实现删除链表的节点
Jul 06 Python
Python数据分析入门之数据读取与存储
May 13 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
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
桌面中心(三)修改数据库
2006/10/09 PHP
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
js 编写规范
2010/03/03 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
node.js中的url.parse方法使用说明
2014/12/10 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
jquery实现select下拉框美化特效代码分享
2015/08/18 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
2016/02/18 Javascript
使用jQuery实现页面定时弹出广告效果
2017/08/24 jQuery
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
新手快速入门JavaScript装饰者模式与AOP
2019/06/24 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
python多线程抓取天涯帖子内容示例
2014/04/03 Python
跟老齐学Python之使用Python查询更新数据库
2014/11/25 Python
Python smallseg分词用法实例分析
2015/05/28 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
Python代码实现KNN算法
2017/12/20 Python
PySide和PyQt加载ui文件的两种方法
2019/02/27 Python
python实现美团订单推送到测试环境,提供便利操作示例
2019/08/09 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
18个Python脚本可加速你的编码速度(提示和技巧)
2019/10/17 Python
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
百货商场楼层班组长竞聘书
2014/03/31 职场文书
安全生产管理责任书
2014/04/16 职场文书
企业文化演讲稿
2014/05/20 职场文书
2015年学生资助工作总结
2015/05/25 职场文书
python 提取html文本的方法
2021/05/20 Python
nginx 配置缓存
2022/05/11 Servers