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 相关文章推荐
Python3实现连接SQLite数据库的方法
Aug 23 Python
python多线程编程中的join函数使用心得
Sep 02 Python
Python挑选文件夹里宽大于300图片的方法
Mar 05 Python
详解Python中的多线程编程
Apr 09 Python
Python创建对称矩阵的方法示例【基于numpy模块】
Oct 12 Python
Python 基于jwt实现认证机制流程解析
Jun 22 Python
Matplotlib 绘制饼图解决文字重叠的方法
Jul 24 Python
flask开启多线程的具体方法
Aug 02 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
Sep 01 Python
如何在Python中创建二叉树
Mar 30 Python
详解Python内置模块Collections
Mar 22 Python
Python Pytorch查询图像的特征从集合或数据库中查找图像
Apr 09 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数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
2012/12/28 PHP
php使用百度翻译api示例分享
2014/01/31 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
discuz图片顺序混乱解决方案
2015/07/29 PHP
php实现递归的三种基本方式
2020/07/04 PHP
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
使用PHP反射机制来构造"CREATE TABLE"的sql语句
2019/03/21 PHP
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
全面解析Angular中$Apply()及$Digest()的区别
2016/08/04 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
js使用highlight.js高亮你的代码
2017/08/18 Javascript
Vue仿手机qq的实例代码(demo)
2017/09/08 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
Vue异步加载about组件
2017/10/31 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
2019/05/30 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
Python计算回文数的方法
2015/03/11 Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
2015/03/30 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
2020/06/23 Python
python3爬取各类天气信息
2018/02/24 Python
深入理解Python爬虫代理池服务
2018/02/28 Python
Python中__slots__属性介绍与基本使用方法
2018/09/05 Python
浅谈Python小波分析库Pywavelets的一点使用心得
2019/07/09 Python
如何通过python实现人脸识别验证
2020/01/17 Python
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
实习期自我鉴定
2013/10/11 职场文书
调查研究项目计划书
2014/04/29 职场文书
企业人事任命书
2014/06/05 职场文书
考勤制度通知
2015/04/25 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书
如何解决springcloud feign 首次调用100%失败的问题
2021/06/23 Java/Android
Win11安装受阻怎么办? Windows11安装问题与解决方案汇总
2021/11/21 数码科技