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实现批量转换文件编码的方法
Jul 28 Python
在Python中pandas.DataFrame重置索引名称的实例
Nov 06 Python
python 搜索大文件的实例代码
Jul 08 Python
python实现kNN算法识别手写体数字的示例代码
Aug 16 Python
Pytorch Tensor 输出为txt和mat格式方式
Jan 03 Python
关于tf.TFRecordReader()函数的用法解析
Feb 17 Python
python 获取当前目录下的文件目录和文件名实例代码详解
Mar 10 Python
python实现用户名密码校验
Mar 18 Python
Python实现http接口自动化测试的示例代码
Oct 09 Python
使用Pytorch搭建模型的步骤
Nov 16 Python
Alpine安装Python3依赖出现的问题及解决方法
Dec 25 Python
Scrapy实现模拟登录的示例代码
Feb 21 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
PHP教程 预定义变量
2009/10/23 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
js Html结构转字符串形式显示代码
2011/11/15 Javascript
js实现图片放大缩小功能后进行复杂排序的方法
2012/11/08 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
JavaScript 和 Java 的区别浅析
2013/07/31 Javascript
jquery实现ajax提交form表单的方法总结
2014/03/03 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
JavaScript学习笔记之基础语法
2015/01/22 Javascript
jQuery表单域选择器用法分析
2015/02/10 Javascript
Jquery 垂直多级手风琴菜单附源码下载
2015/11/17 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
2018/08/24 Javascript
微信小程序之裁剪图片成圆形的实现代码
2018/10/11 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
es6中reduce的基本使用方法
2019/09/10 Javascript
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
python多进程实现进程间通信实例
2017/11/24 Python
解决Mac下使用python的坑
2019/08/13 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
详解h5页面在不同ios设备上的问题总结
2019/03/01 HTML / CSS
墨西哥网上购物:Linio墨西哥
2016/10/20 全球购物
Ashford台湾:以折扣价提供奢华的男女用表款
2019/12/04 全球购物
环保专项行动方案
2014/05/12 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
2016教师节问候语
2015/11/10 职场文书
2016高考寄语集锦
2015/12/04 职场文书
深入浅析React中diff算法
2021/05/19 Javascript
唤醒紫霞仙子,携手再游三界!大话手游X《大话西游》电影合作专属剧情任务
2022/04/03 其他游戏