今天学习异常,错误,调试。遇到一个解释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")
大家如果对于这个代码有什么疑惑,欢迎前来交流鸭。