成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

sPeng / 3247人閱讀

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

起步

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 會(huì)為異常對(duì)象設(shè)置 __cause__ 屬性表明異常的是由誰直接引起的。

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

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

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

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

from 還有個(gè)特別的用法: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 會(huì)為異常設(shè)置上下文,可以手動(dòng)通過 with_traceback() 設(shè)置其上下文,或者通過 from 來指定異常因誰引起的。這些手段都是為了得到更友好的異?;厮菪畔?,打印清晰的異常上下文。若要忽略上下文,則可以通過 raise ... from None 來禁止自動(dòng)顯示異常上下文。

參考

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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/42804.html

相關(guān)文章

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

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

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

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

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

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

    wujl596 評(píng)論0 收藏0
  • 捕獲異常然后再拋出另一個(gè)異常正確姿勢(shì)

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

    RebeccaZhong 評(píng)論0 收藏0
  • 奇技淫巧第二期

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

    Rocture 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<