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之玩转字符串(2)
Sep 14 Python
如何在Python中编写并发程序
Feb 27 Python
python解决Fedora解压zip时中文乱码的方法
Sep 18 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
May 04 Python
python关于矩阵重复赋值覆盖问题的解决方法
Jul 19 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
Aug 26 Python
TensorFlow内存管理bfc算法实例
Feb 03 Python
Python pexpect模块及shell脚本except原理解析
Aug 03 Python
python基础入门之字典和集合
Jun 13 Python
Python常用配置文件ini、json、yaml读写总结
Jul 09 Python
如何基于python实现单目三维重建详解
Jun 25 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 解压rar文件及zip文件的方法
2014/05/05 PHP
用PHP解决的一个栈的面试题
2014/07/02 PHP
ThinkPHP自动填充实现无限级分类的方法
2014/08/22 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
2012/11/01 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
Vue中引入样式文件的方法
2017/08/18 Javascript
详解vue 图片上传功能
2019/04/30 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
2019/09/20 Javascript
layer关闭弹出窗口触发表单提交问题的处理方法
2019/09/25 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
JavaScript逻辑运算符相关总结
2020/09/04 Javascript
Python代理抓取并验证使用多线程实现
2013/05/03 Python
Python实现的二维码生成小软件
2014/07/11 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
2017/07/24 Python
python flask实现分页的示例代码
2018/08/02 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
2021/03/03 Python
HearthSong官网:儿童户外玩具、儿童益智玩具
2017/10/16 全球购物
澳大利亚最大的百货公司:Myer
2018/12/21 全球购物
Gerry Weber德国官网:优质女性时装,德国最大的时装公司之一
2019/11/02 全球购物
什么是View State?
2013/01/27 面试题
个人作风纪律整顿整改措施
2014/10/25 职场文书
安全生产工作汇报
2014/10/28 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
工程部岗位职责
2015/02/10 职场文书
2015年助理工程师工作总结
2015/04/03 职场文书
2016年感恩教师节校园广播稿
2015/12/18 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书
pytorch--之halfTensor的使用详解
2021/05/24 Python
SQL Server表分区删除详情
2021/10/16 SQL Server
MySQL创建表操作命令分享
2022/03/25 MySQL