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下实现备份程序实例
Jul 04 Python
python实用代码片段收集贴
Jun 03 Python
使用Python写一个贪吃蛇游戏实例代码
Aug 21 Python
Python实现的用户登录系统功能示例
Feb 05 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
Python使用Selenium爬取淘宝异步加载的数据方法
Dec 17 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
Sep 06 Python
python如何使用socketserver模块实现并发聊天
Dec 14 Python
Python3 Click模块的使用方法详解
Feb 12 Python
Python集成开发工具Pycharm的安装和使用详解
Mar 18 Python
python使用梯度下降算法实现一个多线性回归
Mar 24 Python
OpenCV 之按位运算举例解析
Jun 19 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
Apache2 httpd.conf 中文版
2006/12/06 PHP
色色整理的PHP面试题集锦
2012/03/08 PHP
浅析PHP页面局部刷新功能的实现小结
2013/06/21 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
2014/07/12 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
Laravel 自带的Auth验证登录方法
2019/09/30 PHP
JavaScript While 循环基础教程
2007/04/05 Javascript
转一个日期输入控件,支持FF
2007/04/27 Javascript
突发奇想的一个jquery插件
2010/11/19 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
JavaScript中的noscript元素属性位置及作用介绍
2013/04/11 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
javascript实现五星评价代码(源码下载)
2015/08/11 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
JS模拟简易滚动条效果代码(附demo源码)
2016/04/05 Javascript
浅谈String.valueOf()方法的使用
2016/06/06 Javascript
javascript回到顶部特效
2016/07/30 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
2016/12/08 Javascript
javascript函数的节流[throttle]与防抖[debounce]
2017/11/15 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
Python+Wordpress制作小说站
2017/04/14 Python
详解Python之unittest单元测试代码
2018/01/24 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
2019/10/24 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
森林防火工作方案
2014/02/14 职场文书
捐书活动总结
2014/05/04 职场文书
夫妻分居协议书范本
2014/11/28 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
Pyhton模块和包相关知识总结
2021/05/12 Python
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle