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运行效率的方法之间的对比
Apr 03 Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
Feb 13 Python
python requests 测试代理ip是否生效
Jul 25 Python
使用Python如何测试InnoDB与MyISAM的读写性能
Sep 18 Python
python用plt画图时,cmp设置方法
Dec 13 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
Dec 17 Python
Python增强赋值和共享引用注意事项小结
May 28 Python
Python实现一个带权无回置随机抽选函数的方法
Jul 24 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
Aug 05 Python
学python安装的软件总结
Oct 12 Python
pygame实现打字游戏
Feb 19 Python
利用python查看数组中的所有元素是否相同
Jan 08 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
当年上海收录机产品生产,进口和价格情况
2021/03/04 无线电
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
分享20多个很棒的jQuery 文件上传插件或教程
2011/09/04 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
js实现按一下删除键删除整个单词附demo
2014/09/05 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
jQuery表单插件ajaxForm实例详解
2017/01/17 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
security.js实现的RSA加密功能示例
2018/06/06 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
[03:15]2014DOTA2国际邀请赛 专访国士无双信心满满
2014/07/12 DOTA
深入解析Python的Tornado框架中内置的模板引擎
2016/07/11 Python
python生成式的send()方法(详解)
2017/05/08 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
2017/09/08 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
2019/01/29 Python
python验证身份证信息实例代码
2019/05/06 Python
Django实现基于类的分页功能
2019/10/31 Python
详解python模块pychartdir安装及导入问题
2020/10/22 Python
CSS3下的渐变文字效果实现示例
2018/03/02 HTML / CSS
html5自动播放mov格式视频的实例代码
2020/01/14 HTML / CSS
英国领先的品牌珠宝和配件供应商:Acotis Jewellery
2018/03/07 全球购物
Converse匡威法国官网:美国著名帆布鞋品牌
2018/12/05 全球购物
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
《油菜花开了》教学反思
2014/02/22 职场文书
给校长的一封建议书
2014/03/12 职场文书
班组建设经验交流材料
2014/05/12 职场文书
报效祖国演讲稿
2014/09/15 职场文书
2014年话务员工作总结
2014/11/19 职场文书
小学语文教学随笔
2015/08/14 职场文书
2016年感恩父亲节活动总结
2016/04/01 职场文书
Vue接口封装的完整步骤记录
2021/05/14 Vue.js
Python Pandas pandas.read_sql_query函数实例用法分析
2021/06/21 Python
nginx服务器的下载安装与使用详解
2021/08/02 Servers