Python finally的用法

本文详细探讨了Python中try-except-finally结构的使用,包括异常捕获、else子句异常、return语句的执行顺序以及实际案例分析。理解finally确保的代码执行,对于编写健壮的异常处理至关重要。
该文章已生成可运行项目,

参考 Python finally的用法 - 云+社区 - 腾讯云

try语句有一个可选finally子句,用于定义在所有情况下都必须执行的finally操作

try:
    raise KeyboardInterrupt
finally:
    print('Goodbye, world!')


Goodbye, world!
KeyboardInterrupt
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>

如果存在finally子句,则该finally子句将作为try语句完成之前的最后一项任务执行。finally无论该try语句是否产生异常,该子句都会运行。

以下几点讨论了发生异常时更复杂的情况:

  • 如果在执行该try子句期间发生异常,则该异常可以由except子句处理。如果该异常未由except子句处理,finally则在执行该子句后将重新引发该异常。

  • 执行exceptor else子句期间可能会发生异常。同样,在finally执行该子句之后,将重新引发异常。

  • 如果try语句到达breakcontinuereturn语句时,finally条款将在<try or else or except的>breakcontinuereturn语句之前执行。

  • 如果finally子句包含一条return语句,则该finally子句的return语句将在<try or else or except的>子句中的return语句之前执行,所以事实上执行了的是finally的return,而不是在<try or else or except>中执行return语句。

案例1.

>>> def bool_return():
...     try:
...         return True
...     finally:
...         return False
...
>>> bool_return()
False

 案例2.

def bool_return():
    try:
        raise Exception
    except Exception:
        return True
    finally:
        return False

print(bool_return())

False

案例3.

>>> def divide(x, y):
...     try:
...         result = x / y
...     except ZeroDivisionError:
...         print("division by zero!")
...     else:
...         print("result is", result)
...     finally:
...         print("executing finally clause")
...
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'

本文章已经生成可运行项目
### Python 中 `finally` 语句的用法Python 的异常处理机制中,`finally` 是一种特殊的子句,无论是否发生异常都会被执行。它的主要用途是在任何情况下执行清理操作,比如关闭文件、释放资源等[^1]。 以下是关于 `finally` 子句的一些关键点: - **基本结构** `try...finally` 结构通常用于确保某些代码无论如何都会运行。即使程序抛出了未被捕获的异常,或者通过 `return` 或者 `break` 提前退出循环/函数,`finally` 块中的代码仍然会被执行[^4]。 ```python try: # 可能引发异常的操作 result = 10 / num except ZeroDivisionError as e: print(f"错误: {e}") finally: # 清理工作 print("这是 finally 块的内容,总是会执行。") ``` - **与 `except` 和 `else` 配合使用** 当存在多个异常处理分支时(如 `except`, `else`),`finally` 总是位于最后一个位置,并且会在其他所有分支完成后无条件执行[^5]。 ```python def divide(a, b): try: result = a / b except ZeroDivisionError: print("除数不能为零!") else: print(f"{a} / {b} = {result}") finally: print("计算结束.") divide(10, 2) # 输出正常结果并打印 '计算结束.' divide(10, 0) # 抛出异常但仍打印 '计算结束.' ``` - **返回值的影响** 如果 `try` 或 `except` 块中有 `return` 语句,则 `finally` 块仍会先于实际返回之前执行。这可能会影响最终返回的结果。 ```python def test_finally(): try: return "来自 try" finally: return "来自 finally" print(test_finally()) # 输出: 来自 finally ``` 上述例子展示了当 `finally` 包含自己的 `return` 语句时,它实际上覆盖了前面的返回值。 --- #### 注意事项 尽管 `finally` 很强大,但在编写代码时应谨慎设计逻辑流程,避免因滥用而导致难以调试的情况。例如,在 `finally` 中修改状态变量可能会引起意外行为[^2]。 --- ### 示例教程 下面是一个完整的示例,演示如何利用 `finally` 安全地管理外部资源(如打开和关闭文件): ```python def read_file(file_path): file_descriptor = None try: file_descriptor = open(file_path, 'r', encoding='utf-8') content = file_descriptor.read() print(content[:10]) # 打印文件开头部分数据 except FileNotFoundError: print("指定路径下的文件不存在!") finally: if file_descriptor is not None and not file_descriptor.closed: file_descriptor.close() # 确保文件被正确关闭 print("已成功关闭文件.") read_file('example.txt') # 替换为你本地存在的文件名测试效果 ``` 此脚本尝试读取指定文件内容的同时,保证即便遇到问题也能妥善释放占用的文件描述符资源[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wanderer001

ROIAlign原理

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值