python的try finally (还真不简单)
https://www.cnblogs.com/cotton/p/3785999.html
def f(): try: print 1 return 1 finally: print 0 return 0
print f()
结果为 1 0 0
以运行结果为准,说明无论try里执行什么,即使是return,也会调用finally的。
def f(): try: print 1 return 1 finally: print 0 #return 0
将finally的return屏蔽掉,你或许猜到结果了
结果为 1 0 1
诧异吗?
对比上个结果,说明try的返回值被finally的返回值覆盖了,或许是因为一个函数只能有一个返回值,以最后一个结果为准
def f(): try: print 1 return 1 except: return 2 else: print 3 return 3 finally: print 0 #return 0
你觉得,没有异常else会执行吗?
如你所料,并没有执行。
结果为 1 0 1
说明try里面运行完之后return,阻挡了else的执行,但是并没有影响finally的执行。
“如果try中没有异常,那么except部分将跳过,执行else中的语句。(前提是try里没有返回值)
finally是无论是否有异常,最后都要做的一些事情。”(无论try里是否有返回值)
这里补充一句,在含有return的情况下,并不会阻碍finally的执行。(但是会阻碍else)
又增补了点测试:
#根据 https://www.cnblogs.com/cotton/p/3785999.html 《Python中关于try...finally的一些疑问》 def test_finally_return1(): try: print(1) return 1 finally: print(0) return 0 def test_finally_return2(): try: print(1) return 1 finally: print(0) #return 0 def test_else_finally1(): try: print(1) return 1 except: return 2 else: print(3) return 3 finally: print(0) #return 0 def test_else_finally2(): try: print(1) return 1 except: return 2 else: print(3) #return 3 finally: print(0) return 0 def test_else_finally3(): try: print(1) #return 1 except: print(2) #return 2 else: print(3) #return 3 finally: print(0) return 0 def test_else_return1(): try: print(1) return 1 except: return 2 else: print(3) return 3 # finally: # print(0) #return 0 def test_else_return2(): try: print(1) #return 1 except: return 2 else: print(3) return 3 # finally: # print(0) #return 0 if __name__ == '__main__': print('测试1') print(test_finally_return1()) print('测试2') print(test_finally_return2()) print('测试3') print(test_else_finally1()) print('测试4') print(test_else_finally2()) print('测试5') print(test_else_return1()) print('测试6') print(test_else_return2()) print('测试7') print(test_else_finally3())
测试结果:
➜ test python3 test_try_finally.py 测试1 1 0 0 测试2 1 0 1 测试3 1 0 1 测试4 1 0 0 测试5 1 1 测试6 1 3 3 测试7 1 3 0 0
自己的总结:
不要在try else里写返回值。如果没有finally,就写在最后,或者只写在finally里。
try except else里都是做某事 而不是处理返回
—————————————
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理