In [8]: def bar():
...: a = 10
...: try:
...: raise
...: except:
...: try:
...: raise
...: except:
...: raise
...: finally:
...: return a
In [9]: bar()
Out[9]: 10
天蓬老师2017-04-18 10:30:05
這個還蠻有趣的,先跑幾個程式碼
def bar():
a = 10
try:
print 1
raise
except:
print 2
raise
finally:
print 3
return a
bar()
# 打印(没有抛出异常):
# 2
# 3
def bar():
a = 10
try:
print 1
raise
except:
print 2
raise
finally:
print 3
# return a
bar()
# 打印(抛出了异常):
# 2
# Traceback (most recent call last):
# 3
# File "/Users/xuxin/workplace/DailyScript/segmentfault/file_list_to_dict.py", line 23, in <module>
# bar()
# File "/Users/xuxin/workplace/DailyScript/segmentfault/file_list_to_dict.py", line 18, in bar
# raise ValueError()
# ValueError
看來f()在拋出異常併後,執行了except中的return,但是並沒有回到呼叫者,而是「堅持」將finally中的程式碼執行完畢。至此,我算是真正理解了finally的真正意義,就是即使已經return,仍要執行finally中的程式碼。
這裡我們同樣可以這麼理解,在try中如果出現了需要退出方法的語句,但他會努力執行finally,如果finally有return方法,則會立即返回,不會執行之前的退出語句。
這個時候,我們可以看看這串程式碼
def bar():
a = 10
try:
print 1
raise
finally:
print 3
return a
bar()
# 打印(没有抛出异常):
# 3
現學現賣,如有錯誤,請指出修改~