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