python - 为什么这段代码没有异常抛出?
天蓬老师
天蓬老师 2017-04-18 10:28:05
0
2
501
In [8]: def bar():
   ...:     a = 10
   ...:     try:
   ...:         raise
   ...:     except:
   ...:         try:
   ...:             raise
   ...:         except:
   ...:             raise
   ...:     finally:
   ...:         return a


In [9]: bar()
Out[9]: 10
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回覆(2)
Peter_Zhu

這個還蠻有趣的,先跑幾個程式碼

1. 這段程式碼表示你不要管套幾層try,其實只要弄清楚except下為什麼不拋出異常即刻
def bar():
    a = 10
    try:
        print 1
        raise
    except:
        print 2
        raise
    finally:
        print 3
        return a

bar()
# 打印(没有抛出异常): 
# 2
# 3
2. 這段程式碼表示如果finally如果有return語句,則不會拋出異常,沒有return則會拋出異常
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
3. 我去查了一下,看到了這篇文章深入理解Python的finally

看來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
4.這時候是不是對finally比較清楚了呢~

現學現賣,如有錯誤,請指出修改~

左手右手慢动作

要是最後還是拋出了異常,那你的except語句不是白寫了?

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板