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的Tornado框架结合memcached页面改善博客性能
Apr 24 Python
Python自动生产表情包
Mar 17 Python
Linux下python制作名片示例
Jul 20 Python
python使用循环打印所有三位数水仙花数的实例
Nov 13 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
Aug 05 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
Aug 16 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
python实现串口通信的示例代码
Feb 10 Python
Python requests接口测试实现代码
Sep 08 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
Nov 24 Python
Python中else的三种使用场景
Jun 16 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 curl 并发最佳实践代码分享
2012/09/05 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
2014/10/16 PHP
php实现比较两个文件夹异同的方法
2015/06/18 PHP
初识ThinkPHP控制器
2016/04/07 PHP
PHP实现文件下载【实例分享】
2017/04/28 PHP
浅谈PHP封装CURL
2019/03/06 PHP
javascript 图片上传预览-兼容标准
2009/06/01 Javascript
JS 自定义带默认值的函数
2011/07/21 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
javascript中[]和{}对象使用介绍
2013/03/20 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
2015/01/18 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
Bootstrap创建可折叠的组件
2016/02/23 Javascript
Bootstrap开发实战之响应式轮播图
2016/06/02 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
angularjs+bootstrap菜单的使用示例代码
2017/03/07 Javascript
webpack4 css打包压缩问题的解决
2018/05/18 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
探寻python多线程ctrl+c退出问题解决方案
2014/10/23 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
Python异常处理例题整理
2019/07/07 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
Python中如何添加自定义模块
2020/06/09 Python
详解Html5微信支付爬坑之路
2018/07/24 HTML / CSS
美体小铺印度官网:The Body Shop印度
2019/10/17 全球购物
军训自我鉴定范文
2014/02/13 职场文书
护理专科自荐书范文
2014/02/18 职场文书
三八妇女节慰问信
2015/02/14 职场文书
优秀教师主要事迹材料
2015/11/04 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
MySQL派生表联表查询实战过程
2022/03/20 MySQL
MySQL插入数据与查询数据
2022/03/25 MySQL
python 学习GCN图卷积神经网络
2022/05/11 Python