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实现在windows下操作word的方法
Apr 28 Python
浅谈python多线程和队列管理shell程序
Aug 04 Python
Python实现堆排序的方法详解
May 03 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
May 16 Python
Python学习入门之区块链详解
Jul 25 Python
Python3 适合初学者学习的银行账户登录系统实例
Aug 08 Python
python中map的基本用法示例
Sep 10 Python
python实现简易数码时钟
Feb 19 Python
基于Tensorflow高阶读写教程
Feb 10 Python
Python如何爬取b站热门视频并导入Excel
Aug 10 Python
Python远程linux执行命令实现
Nov 11 Python
写好Python代码的几条重要技巧
May 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调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
ThinkPHP实现二级循环读取的方法
2014/11/03 PHP
PHP中常见的缓存技术实例分析
2015/09/23 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
Flash对联广告的关闭按钮讨论
2007/01/30 Javascript
js 居中漂浮广告
2010/03/21 Javascript
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
javascript页面动态显示时间变化示例代码
2013/12/18 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
2014/03/26 Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
2014/06/24 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
vue.js+Echarts开发图表放大缩小功能实例
2017/06/09 Javascript
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
Vue项目中如何引入icon图标
2018/03/28 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
vue2.x 对象劫持的原理实现
2020/04/19 Javascript
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
vue中axios封装使用的完整教程
2021/03/03 Vue.js
python发送伪造的arp请求
2014/01/09 Python
python海龟绘图实例教程
2014/07/24 Python
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
Django框架中处理URLconf中特定的URL的方法
2015/07/20 Python
python 匹配url中是否存在IP地址的方法
2018/06/04 Python
python redis 删除key脚本的实例
2019/02/19 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
英国网上自行车商店:Tredz Bikes
2019/10/29 全球购物
审核会计岗位职责
2013/11/08 职场文书
森林防火标语
2014/06/23 职场文书
2014年残联工作总结
2014/11/21 职场文书
个人年终总结开头
2015/03/06 职场文书
上市公司董事长岗位职责
2015/04/16 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书