try..finally的相关问题

本文探讨了Python中try...finally语句的行为特点,尤其是在异常被捕获情况下的表现。通过具体示例,揭示了不同场景下finally块后语句的执行逻辑,并提供了深入理解异常处理机制的途径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天学习异常,错误,调试。遇到一个解释try...finally的例子。

正如我们所知,对于try..finally,不论是否存在异常,finally之后的语句一定都会执行。但有没有异常还是会有点不一样。

存在异常时,finally执行后就彻底结束了,后面的其余语句不会再执行;但如果没有异常,那么finally结束后,还会继续执行后面 的语句,如果存在的话。

这是我们公认的一个道理。

但是今天我遇到了一个很奇怪的例子,明明存在了异常,但是finally之后的语句竟然还会再次执行(雾)

下面将这个例子分享出来,希望大家一起来看看,并能够帮我分析一下这个是怎么一回事。

#没有异常的情况
def f(x,y):
    print(x+y)
try:
    f(1,2)

finally:
    print("end...")
print("continue...")
"""
3
end...
"""
print("-"*40)
#有异常的情况(????)
try:
    f([1,2],"sd")

except TypeError:
    print("error...")

finally:
    print("end...")
print("continue...")
"""
error...
end...
continue...
"""

#更新#

往后学习,我自己解答了这个疑问。对于try...finally,存在异常时,如果这个异常被捕获(即存在except)了,那么finally之后的语句仍能正常进行,如果没有被捕获或捕获错误(except后面的errorname不正确),那么将会在完成finally之后的语句后,结束整个程序。

下面提供一个例子,帮助大家更加全面的学习"异常、捕获"(例子来源于原版的《fluent python》)

sep="-"*45+'\n'

print(sep+"EXPECTION RAISED AND CAUGHT")
try:
    x="spam"[99]
except IndexError:
    print("except run")
finally:
    print("fianlly run")
print("after run")


print(sep+"NO EXCEPTION RISED")
try:
    x="spam"[3]
except IndexError:
    print("except error")
finally:
    print("finally run")
print("after run")

print(sep+"NO EXCEPTION RAISED,WITH ELSE")
try:
    x="spam"[3]
except IndexError:
    print("except error")
else:
    print("else run")
finally:
    print("finally run")
print("after run")

print(sep+"EXCEPTION RAISED BUT NO CAUGHT")
try:
    x=1/0
except IndexError:
    print("except error")
finally:
    print("fianlly run")
print("after run")

大家如果对于这个代码有什么疑惑,欢迎前来交流鸭。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值