摘要:處理異常時發(fā)生了新的異常,在不使用時更傾向于新異常與正在處理的異常沒有關(guān)聯(lián)。而則是能指出新異常是因舊異常直接引起的。這樣的異常之間的關(guān)聯(lián)有助于后續(xù)對異常的分析和排查。若要忽略上下文,則可以通過來禁止自動顯示異常上下文。
起步
Python 的 raise 和 raise 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, inprint(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總結(jié)raise RuntimeError("Something bad happened") from None RuntimeError: Something bad happened
在異常處理程序或 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
摘要:前言最近之父龜爺終于在官方郵件組落實了的終焉之日。于之后的年月日發(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)...
摘要:盡量使用內(nèi)置的異常處理語句來替換語句,比如語句,方法。以上是最簡單的重新拋出異常的做法,也是推薦的做法。除了包含所有的外還包含了,和三個異常。避免在語句塊中干一些沒意義的事情,捕獲異常也是需要成本的。 異常處理在任何一門編程語言里都是值得關(guān)注的一個話題,良好的異常處理可以讓你的程序更加健壯,清晰的錯誤信息更能幫助你快速修復問題。在Python中,和不部分高級語言一樣,使用了try/ex...
摘要:語句就是幫助我們拋出知道異常的,比如的使用很簡單,它的語法如下如果它后面不帶表達式參數(shù),它會重新引發(fā)當前作用域內(nèi)最后一個激活的異常。,用于異常的串聯(lián)。自定義的異常類的名稱通常以錯誤結(jié)尾,類似與內(nèi)置標準異常的命名。 前面我們講到的Python編程過程中,在可能出現(xiàn)異常的地方使用嘗試語句,來正確的處理一些異常,可以保證程序不中斷繼續(xù)運行。 showImg(https://segmentfa...
摘要:下面我們來看一下效果下次需要捕獲一個異常然后再拋出另一個異常的時候大家可以試試本文的方法。 一般實現(xiàn)捕獲異常然后再拋出另一個異常的方法類似下面這樣: def div(): 2 / 0 try: div() except ZeroDivisionError as e: raise ValueError(e) 不知道大家有沒有注意到這樣拋出異常的方式有一個很嚴重的...
閱讀 2669·2021-11-23 09:51
閱讀 2427·2021-09-30 09:48
閱讀 2057·2021-09-22 15:24
閱讀 1020·2021-09-06 15:02
閱讀 3320·2021-08-17 10:14
閱讀 1951·2021-07-30 18:50
閱讀 1990·2019-08-30 15:53
閱讀 3189·2019-08-29 18:43