返回顶部
首页 > 资讯 > 后端开发 > Python >Python学习之异常中的finally使用详解
  • 462
分享到

Python学习之异常中的finally使用详解

2024-04-02 19:04:59 462人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录finally的功能与用法finally示例案例finally触发的必然性与优先级try语法伴随except或finally的必然性finally的历史今天我们来学习一下 异常语

今天我们来学习一下 异常语法 中的另一个成员 —> finally ; 通过学习 finally ,可以帮助我们更好的处理异常。

finally 的功能与用法

finally 的功能:finally的是最后的意思,配合异常的语法来说,它就是最后执行的代码块。

无论是否发生了异常,一定会执行 finally 的代码块

在函数中,即便在 try 或 except 中进行了 return 也依旧会执行 finally 代码块

try 语法 至少要伴随 except 或 finally 中的一个

finally 的用法:示例如下

try:
    <代码块1>
except:
    <代码块2>
finally:
    <代码块3>

finally 示例案例

def test():
    try:
        1 / 0
    except Exception as e:
        print(e)
    finally:
        print('通用异常捕获已完成')


result = test()
print(result)

# >>> 执行结果如下:
# >>> division by zero
# >>> 通用异常捕获已完成

finally 触发的必然性与优先级

接下来我们看看 在 try 或 except 中进行了 return 的场景:

def test():
    try:
        1 / 0
    except Exception as e:
        return e
    finally:
        print('通用异常捕获已完成')


result = test()
print(result)

# >>> 执行结果如下:
# >>> 通用异常捕获已完成
# >>> division by zero

这里我们是不是发现了一个问题?先输出的 finally 代码块,后输出的 except 的 代码块。

python 程序的执行顺序是自上而下执行的,为什么会出现这样的结果呢?我么尝试在 except 的 代码块增加一行输出的测试代码,看一下执行的顺序究竟是什么样的。

def test():
    try:
        1 / 0
    except Exception as e:
        print('exception——test')
        return e
    finally:
        print('通用异常捕获已完成')


result = test()
print(result)

# >>> 执行结果如下:
# >>> exception——test
# >>> 通用异常捕获已完成
# >>> division by zero

从执行结果可以得出结论,程序依然是自上而下执行的。其实造成这样结果的原因是捕获到异常后会将异常信息赋值给变量 e 返回,在调用test()时将返回值赋值给了 result ,因此在打印时可以得到的结果就是先输出的 finally 的代码块,再输出的 result 的赋值结果 。

同时也在次印证了我们上文针对 finally 的功能的描述 :try 或 except 中进行了 return 也依旧会执行 finally 代码块。

既然 except 的代码块我们得到了证实,那么 try 的代码块呢?

def test():
    try:
        print('try_test')
        return 'try'
    except Exception as e:
        print(e)
    finally:
        print('通用异常捕获已完成')


result = test()
print(result)

# >>> 执行结果如下:
# >>> try_test
# >>> 通用异常捕获已完成
# >>> try

# >>> 得出了同样的 finally 必然触发性 的结论

再思考一个问题,之前我们的 finally 的代码块 都是输出的 print 语句,如果我们在 try 或 except 与 finally 的代码块 中都使用 return ,那么会返回谁的 return 的结果呢?

def test():
    try:
        1 / 0
    except Exception as e:
        return e
    finally:
        return '通用异常捕获已完成'


result = test()
print(result)

# >>> 执行结果如下:
# >>> 通用异常捕获已完成

从执行结果我们看到, except 与 finally 的代码块 中都使用 return ,同时我们也知道会先触发 except 代码块的 return ,但是最终返回的依然是 finally 的代码块 中都使用 return。

虽然 except 代码块有 return ,但是因为 finally 的代码块 中也使用了 return ,所以我们的程序最终还是选择了 finally 的代码块 中的 return 进行返回。最终得出 finally 的代码块 中的 return 返回的级别更高的结论。

try 语法 伴随 except 或 finally 的必然性

我们看下面的一个小例子

def test():
    try:
        1 / 0
    finally:
        print('通用异常捕获已完成')


result = test()
print(result)

# >>> 执行结果如下:
# >>> 通用异常捕获已完成
# >>> Traceback (most recent call last):
# >>> 	File "D:\PyCharmProjects\XXX\XXX.py", line 81, in <module>
# >>> 	    result = test()
# >>>   File "D:\PycharmProjects\XXX\XXX.py", line 76, in test
# >>>       1 / 0
# >>>   ZeroDivisionError: division by zero

可以看到,虽然产生了报错,但是我们的 finally 代码块依然被执行了。让我们试试在这种情况下,直接使用 return 会怎么样?

def test():
    try:
        1 / 0
    finally:
        return '通用异常捕获已完成'


result = test()
print(result)

# >>> 执行结果如下:
# >>> 通用异常捕获已完成

此时我们发现, finally 代码块依然被执行了,不仅如此,刚刚出现的错误也被忽略了。说明当 try 出现异常的时候会被直接忽略,直接跳转到 finally 的代码块。

这就是 try 与 finally 的组合效果,不过在我们平时的工作中,还是希望 使用 try 配合 except 将 异常类型(信息) 友好的打印出来,再进行return 会更好。

finally 的历史

Python 2.5 版本之前, finally 需要独立使用不可以和 try 进行配合,在 python 2.5 版本 之后才演变成了现在这个样子。

如果未来有机会使用较老版本的 python ,看到这样的情况,不要觉得奇怪。

到此这篇关于Python学习之异常中的finally使用详解的文章就介绍到这了,更多相关Python异常 finally内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python学习之异常中的finally使用详解

本文链接: https://lsjlt.com/news/142585.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python学习之异常中的finally使用详解
    目录finally的功能与用法finally示例案例finally触发的必然性与优先级try语法伴随except或finally的必然性finally的历史今天我们来学习一下 异常语...
    99+
    2024-04-02
  • Python学习之异常断言详解
    该章节我们来学习 异常的最后一个知识点 - 断言 ,断言是判断一个表达式,在表达式为 False 的时候触发异常。表达式我们可以对号入座,可以是条件语句中的声明,也可以是是 whil...
    99+
    2024-04-02
  • Python学习之异常处理详解
    目录什么是异常与异常处理异常的语法捕获通用异常捕获具体异常如何捕获多个异常捕获多个异常 - 方法1捕获多个异常 - 方法2本章节主要学习 python 中的异常处理,来看一下该章节的...
    99+
    2024-04-02
  • Python学习之自定义异常详解
    目录自定义抛出异常关键字 - raise演示小案例 - 1演示小案例 - 2自定义异常类总结在上一章我们学习了 异常的三个关键字,分别是try、except 以及 finally。我...
    99+
    2024-04-02
  • Java异常学习之自定义异常详解
    前言哎呀,妈呀,又出异常了!俗话说:“代码虐我千百遍,我待代码如初恋”。小Alan最近一直在忙着工作,已经很久没有写写东西来加深自己的理解了,今天来跟大家聊聊Java异常。Java异常的体系什么的,理论知识啥的我就懒得去BB太多了,是个搞J...
    99+
    2023-05-31
    java 自定义异常 ava
  • C++学习之异常机制详解
    目录1. 异常处理机制介绍2. 如何抛出异常和捕获异常2.1 抛出异常2.2 捕获异常3. 如何实现自己的异常4. 注意事项5. 面试常问的题目6. 答案7. 总结1. 异常处理机制...
    99+
    2023-05-15
    C++异常机制 C++异常
  • python学习之异常处理
    一、语法导致的异常,应该在程序运行前处理 例子: print( 输出: File "E:/python/oldboyday9/learn1.py", line 4     if      ^ SyntaxError: invalid sy...
    99+
    2023-01-31
    异常 python
  • Python学习手册之Python异常和
    在上一篇文章中,我们介绍了 Python 的函数和模块,现在我们介绍 Python 中的异常和文件。 查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/9963920.html 异常和文件 异常 异...
    99+
    2023-01-30
    异常 手册 Python
  • Python学习之元组的使用详解
    目录元组的创建元组的删除元组部分元素的输出元组的嵌套元组元素的个数计算:len()元组中的元素最大最小值的求解:max(),min()元组中某元素出现的次数:count函数元组中某元...
    99+
    2024-04-02
  • Python学习之shell脚本的使用详解
    目录一、sh是什么二、使用步骤1.安装2.使用示例3.使用sh执行命令4.关键字参数5.查找命令6.Baking参数一、sh是什么 SH是一个独特的子进程包装器,可将您的系统程序动态...
    99+
    2023-05-17
    Python使用shell脚本 Python shell脚本 Python shell
  • Python学习之configparser模块的使用详解
    目录1 configparser安装2 configparser简介3 表示方法4 configparser详细使用4.1 对象初始化4.2 获取所有的sections4.3 获取所...
    99+
    2023-01-28
    Python configparser模块使用 Python configparser模块 Python configparser
  • Python学习之字符串常用操作详解
    目录1、查找字符串2、分割字符串3、连接字符串4、替换字符串5、移除字符串的首尾字符6、转换字符串的大小写7、检测字符串(后续还会更新)1、查找字符串 除了使用index()方法在字...
    99+
    2024-04-02
  • SpringMVC学习之JSON和全局异常处理详解
    目录1.为什么要全局异常处理2.异常处理思路3.SpringMVC异常分类4.综合案例         ...
    99+
    2022-11-13
    springmvc全局异常处理 springmvc的json问题 spring mvc json
  • Python学习之os包使用教程详解
    目录os 模块文件与目录函数介绍path 模块​path 模块常用方法今天我们来学习一下 python 的内置包 —> OS 包。OS 包拥有着普遍的操作系统功能,...
    99+
    2024-04-02
  • Python学习之加密模块使用详解
    目录hashlib 模块hashlib 模块的介绍hashlib 模块中的常用加密方法hashlib模块情景练习base64 模块base64 模块的介绍base64 模块 模块中的...
    99+
    2024-04-02
  • Python学习之12个常用基础语法详解
    目录前言1.多个字符串组合为一个字符串2.字符串拆分为子字符串列表3.统计列表中元素的次数4.使用try-except-else-block模块5.使用枚举函数得到key/value...
    99+
    2024-04-02
  • 详解Springboot之Logback的使用学习
    目录一、导入依赖二、配置文件解析三、配置文件结构四、各个组件的作用五、Logger组件六、logger属性七、Appender组件一、导入依赖 普通项目 <dependen...
    99+
    2024-04-02
  • Vue学习之Vuex的使用详解
    目录简介优缺点优点缺点使用场景示例安装Vuex并引入 1.安装vuex2.编写vuex的store3.main.js引入CounterStore.js业务代码测试简介 说明...
    99+
    2024-04-02
  • Spring Boot学习入门之统一异常处理详解
    前言关于之前的一篇所讲到的表单验证中提到,如果产生错误,可以得到错误的信息,但是返回值的问题却没有考虑。其中所提到的Controller:@RequestMapping(value = "/doRegister", method = Req...
    99+
    2023-05-31
    spring boot 统一异常处理
  • Go语言学习笔记之错误和异常详解
    目录错误异常总结错误 Go 语言通过内置的错误接口提供了非常简单的错误处理机制,Error 类型是一个接口类型。 type error interface { Error()...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作