> 文档中心 > Python零基础入门篇 - 42 - 异常中的 finally

Python零基础入门篇 - 42 - 异常中的 finally


前言
✌ 作者简介:渴望力量的哈士奇,大家可以叫我 🐶哈士奇🐶 。(我真的养了一只哈士奇)
📑 个人主页:渴望力量的哈士奇主页
📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥 如果感觉博主的文章还不错的话,还请不吝👍关注、点赞、收藏三连支持👍一下博主哦
💬 人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。💬

📕系列专栏::
               👍 Python全栈系列 - [更新中]    ➡️➡️➡️ 【 本文在该系列】
               👋 网安之路系列
​                       🍋 网安之路踩坑篇
​                       🍋 网安知识扫盲篇
​                       🍋 Vulhub 漏洞复现篇
​                       🍋 Shell脚本编程篇
​                       🍋 Web攻防篇  ➡️➡️➡️ 2021年9月3日停止更新,转战先知等安全社区
​                       🍋 渗透工具使用集锦  ➡️➡️➡️ 2021年9月3日停止更新,转战先知等安全社区
​                ⭐️ 点点点工程师系列
​                       🍹 测试神器 - Charles 篇
​                       🍹 测试神器 - Fiddler 篇
​                       🍹 测试神器 - Jmeter 篇
​                       🍹 自动化 - RobotFrameWork 系列
​                       🍹 自动化 - 基于 JAVA 实现的WEB端UI自动化
                       🍹 自动化 - 基于 MonkeyRunner 实现的APP端UI自动化
​                🤗 2019年之前学习Python留下的乱七八糟系列

🎉🎉欢迎持续关注🎉🎉

Python零基础入门篇 - 42 - 异常中的 finally Python零基础入门篇 - 42 - 异常中的 finally

文章目录

    • 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 # >>>     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 ,看到这样的情况,不要觉得奇怪。

51银饰网