搜尋

首頁  >  問答  >  主體

python - 为什么这段代码没有异常抛出?

In [8]: def bar():
   ...:     a = 10
   ...:     try:
   ...:         raise
   ...:     except:
   ...:         try:
   ...:             raise
   ...:         except:
   ...:             raise
   ...:     finally:
   ...:         return a


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

全部回覆(2)我來回復

  • 天蓬老师

    天蓬老师2017-04-18 10:30:05

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

    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比較清楚了呢~

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

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-18 10:30:05

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

    回覆
    0
  • 取消回覆