成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

raise 與 raise ... from 的區(qū)別

sPeng / 3181人閱讀

摘要:處理異常時發(fā)生了新的異常,在不使用時更傾向于新異常與正在處理的異常沒有關(guān)聯(lián)。而則是能指出新異常是因舊異常直接引起的。這樣的異常之間的關(guān)聯(lián)有助于后續(xù)對異常的分析和排查。若要忽略上下文,則可以通過來禁止自動顯示異常上下文。

起步

Python 的 raiseraise from 之間的區(qū)別是什么?

try:
    print(1 / 0)
except Exception as exc:
    raise RuntimeError("Something bad happened")

輸出:

Traceback (most recent call last):
  File "test4.py", line 2, in 
    print(1 / 0)
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test4.py", line 4, in 
    raise RuntimeError("Something bad happened")
RuntimeError: Something bad happened

raise from

try:
    print(1 / 0)
except Exception as exc:
    raise RuntimeError("Something bad happened") from exc

輸出:

Traceback (most recent call last):
  File "test4.py", line 2, in 
    print(1 / 0)
ZeroDivisionError: division by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "test4.py", line 4, in 
    raise RuntimeError("Something bad happened") from exc
RuntimeError: Something bad happened
分析

不同之處在于,from 會為異常對象設(shè)置 __cause__ 屬性表明異常的是由誰直接引起的。

處理異常時發(fā)生了新的異常,在不使用 from 時更傾向于新異常與正在處理的異常沒有關(guān)聯(lián)。而 from 則是能指出新異常是因舊異常直接引起的。這樣的異常之間的關(guān)聯(lián)有助于后續(xù)對異常的分析和排查。from 語法會有個限制,就是第二個表達式必須是另一個異常類或?qū)嵗?/p>

如果在異常處理程序或 finally 塊中引發(fā)異常,默認情況下,異常機制會隱式工作會將先前的異常附加為新異常的 __context__ 屬性。

當然,也可以通過 with_traceback() 方法為異常設(shè)置上下文 __context__ 屬性,這也能在 traceback 更好的顯示異常信息。

raise Exception("foo occurred").with_traceback(tracebackobj)
禁止異常關(guān)聯(lián)

from 還有個特別的用法:raise ... from None ,它通過設(shè)置 __suppress_context__ 屬性指定來明確禁止異常關(guān)聯(lián):

try:
    print(1 / 0)
except Exception as exc:
    raise RuntimeError("Something bad happened") from None

輸出:

Traceback (most recent call last):
  File "test4.py", line 4, in 
    raise RuntimeError("Something bad happened") from None
RuntimeError: Something bad happened
總結(jié)

在異常處理程序或 finally 塊中引發(fā)異常,Python 會為異常設(shè)置上下文,可以手動通過 with_traceback() 設(shè)置其上下文,或者通過 from 來指定異常因誰引起的。這些手段都是為了得到更友好的異?;厮菪畔ⅲ蛴∏逦漠惓I舷挛?。若要忽略上下文,則可以通過 raise ... from None 來禁止自動顯示異常上下文。

參考

https://docs.python.org/3/ref...

https://docs.python.org/3/lib...

PEP 3109 -- Raising Exceptions in Python 3000

PEP 3134 -- Exception Chaining and Embedded Tracebacks

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42804.html

相關(guān)文章

  • Python2 和 Python3 區(qū)別及兼容技巧

    摘要:前言最近之父龜爺終于在官方郵件組落實了的終焉之日。于之后的年月日發(fā)布,計劃作為的最后一個版本。統(tǒng)一使用作為縮進,如果和同時存在,就會觸發(fā)異常兼容技巧統(tǒng)一使用作為縮進。兼容技巧統(tǒng)一使用內(nèi)置函數(shù)。統(tǒng)一輸出函數(shù)中的即是關(guān)鍵字又是內(nèi)置函數(shù)。 前言 最近 Python 之父 Guido van Rossum(龜爺)終于在 Python 官方郵件組落實了 Python 2.7 的終焉之日(EOL)...

    lmxdawn 評論0 收藏0
  • 總結(jié):Python中異常處理

    摘要:盡量使用內(nèi)置的異常處理語句來替換語句,比如語句,方法。以上是最簡單的重新拋出異常的做法,也是推薦的做法。除了包含所有的外還包含了,和三個異常。避免在語句塊中干一些沒意義的事情,捕獲異常也是需要成本的。 異常處理在任何一門編程語言里都是值得關(guān)注的一個話題,良好的異常處理可以讓你的程序更加健壯,清晰的錯誤信息更能幫助你快速修復問題。在Python中,和不部分高級語言一樣,使用了try/ex...

    douzifly 評論0 收藏0
  • python基礎(chǔ)教程:錯誤處理和異常處理(二)

    摘要:語句就是幫助我們拋出知道異常的,比如的使用很簡單,它的語法如下如果它后面不帶表達式參數(shù),它會重新引發(fā)當前作用域內(nèi)最后一個激活的異常。,用于異常的串聯(lián)。自定義的異常類的名稱通常以錯誤結(jié)尾,類似與內(nèi)置標準異常的命名。 前面我們講到的Python編程過程中,在可能出現(xiàn)異常的地方使用嘗試語句,來正確的處理一些異常,可以保證程序不中斷繼續(xù)運行。 showImg(https://segmentfa...

    wujl596 評論0 收藏0
  • 捕獲異常然后再拋出另一個異常正確姿勢

    摘要:下面我們來看一下效果下次需要捕獲一個異常然后再拋出另一個異常的時候大家可以試試本文的方法。 一般實現(xiàn)捕獲異常然后再拋出另一個異常的方法類似下面這樣: def div(): 2 / 0 try: div() except ZeroDivisionError as e: raise ValueError(e) 不知道大家有沒有注意到這樣拋出異常的方式有一個很嚴重的...

    RebeccaZhong 評論0 收藏0
  • 奇技淫巧第二期

    摘要:因為產(chǎn)生的順序是先比較第一位,再比較第二位,并且沒有很好的解決辦法。這種語法的限制是,需要保證異常從屬與異常。兩個異常都將顯示。 這個系利的初衷是回顧瑣碎知識點,但...

    Rocture 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<