Python Try Except:Finally子句的实际必要场景是什么?
Python try-finally 子句的独特作用
先看你给出的两段代码:
第一段(带finally):
try: some code except: do this else: do that finally: always do
第二段(无finally,直接后续代码):
try: some code except: do this else: do that always do
finally子句能完成不少第二段代码做不到的关键操作,核心就是无论try/except/else块里发生什么,finally的代码一定会执行,具体场景如下:
应对try/except/else中的跳转或返回
如果try、except或else块里有return、break、continue这类跳转语句,第二段的always do会被直接跳过,而finally里的代码不受影响,依然会执行。比如:# 带finally的情况 def demo_return(): try: print("执行try代码") return 1 except: pass finally: print("finally执行了") demo_return() # 输出: # 执行try代码 # finally执行了# 无finally的情况 def demo_normal_return(): try: print("执行try代码") return 1 except: pass print("always do") demo_normal_return() # 输出: # 执行try代码 # 不会打印"always do"处理异常传播中的执行确定性
如果except或else块里抛出了新的异常,第二段的always do会因为异常中断而无法执行,但finally会先执行完自身代码,再把异常继续向上抛出。比如:# 带finally的情况 def demo_exception(): try: 1/0 except ZeroDivisionError: print("捕获除零异常") raise ValueError("新异常") finally: print("finally执行了") try: demo_exception() except ValueError: print("捕获新异常") # 输出: # 捕获除零异常 # finally执行了 # 捕获新异常# 无finally的情况 def demo_normal_exception(): try: 1/0 except ZeroDivisionError: print("捕获除零异常") raise ValueError("新异常") print("always do") try: demo_normal_exception() except ValueError: print("捕获新异常") # 输出: # 捕获除零异常 # 捕获新异常 # 不会打印"always do"确保资源的可靠释放
操作文件、数据库连接、网络套接字这类资源时,finally是保证资源被关闭的最佳方式——不管代码是正常执行、报错,还是中途跳转,finally都能确保释放逻辑执行。比如:# 带finally保证文件关闭 def read_file(): f = open("test.txt", "r") try: content = f.read() return content except: pass finally: f.close() # 无论如何都会关闭文件如果用第二段的写法,一旦try里return或者except里抛新异常,文件就会因没执行到
f.close()而泄漏。
内容的提问来源于stack exchange,提问作者rebelxt
相关产品推荐
相关产品推荐

