摘要:處理異常時發生了新的異常,在不使用時更傾向于新異常與正在處理的異常沒有關聯。而則是能指出新異常是因舊異常直接引起的。這樣的異常之間的關聯有助于后續對異常的分析和排查。若要忽略上下文,則可以通過來禁止自動顯示異常上下文。
起步
Python 的 raise 和 raise from 之間的區別是什么?
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 會為異常對象設置 __cause__ 屬性表明異常的是由誰直接引起的。
處理異常時發生了新的異常,在不使用 from 時更傾向于新異常與正在處理的異常沒有關聯。而 from 則是能指出新異常是因舊異常直接引起的。這樣的異常之間的關聯有助于后續對異常的分析和排查。from 語法會有個限制,就是第二個表達式必須是另一個異常類或實例。
如果在異常處理程序或 finally 塊中引發異常,默認情況下,異常機制會隱式工作會將先前的異常附加為新異常的 __context__ 屬性。
當然,也可以通過 with_traceback() 方法為異常設置上下文 __context__ 屬性,這也能在 traceback 更好的顯示異常信息。
raise Exception("foo occurred").with_traceback(tracebackobj)禁止異常關聯
from 還有個特別的用法:raise ... from None ,它通過設置 __suppress_context__ 屬性指定來明確禁止異常關聯:
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
在異常處理程序或 finally 塊中引發異常,Python 會為異常設置上下文,可以手動通過 with_traceback() 設置其上下文,或者通過 from 來指定異常因誰引起的。這些手段都是為了得到更友好的異常回溯信息,打印清晰的異常上下文。若要忽略上下文,則可以通過 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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42804.html
摘要:前言最近之父龜爺終于在官方郵件組落實了的終焉之日。于之后的年月日發布,計劃作為的最后一個版本。統一使用作為縮進,如果和同時存在,就會觸發異常兼容技巧統一使用作為縮進。兼容技巧統一使用內置函數。統一輸出函數中的即是關鍵字又是內置函數。 前言 最近 Python 之父 Guido van Rossum(龜爺)終于在 Python 官方郵件組落實了 Python 2.7 的終焉之日(EOL)...
摘要:盡量使用內置的異常處理語句來替換語句,比如語句,方法。以上是最簡單的重新拋出異常的做法,也是推薦的做法。除了包含所有的外還包含了,和三個異常。避免在語句塊中干一些沒意義的事情,捕獲異常也是需要成本的。 異常處理在任何一門編程語言里都是值得關注的一個話題,良好的異常處理可以讓你的程序更加健壯,清晰的錯誤信息更能幫助你快速修復問題。在Python中,和不部分高級語言一樣,使用了try/ex...
摘要:語句就是幫助我們拋出知道異常的,比如的使用很簡單,它的語法如下如果它后面不帶表達式參數,它會重新引發當前作用域內最后一個激活的異常。,用于異常的串聯。自定義的異常類的名稱通常以錯誤結尾,類似與內置標準異常的命名。 前面我們講到的Python編程過程中,在可能出現異常的地方使用嘗試語句,來正確的處理一些異常,可以保證程序不中斷繼續運行。 showImg(https://segmentfa...
摘要:下面我們來看一下效果下次需要捕獲一個異常然后再拋出另一個異常的時候大家可以試試本文的方法。 一般實現捕獲異常然后再拋出另一個異常的方法類似下面這樣: def div(): 2 / 0 try: div() except ZeroDivisionError as e: raise ValueError(e) 不知道大家有沒有注意到這樣拋出異常的方式有一個很嚴重的...
閱讀 2628·2021-11-23 09:51
閱讀 2418·2021-09-30 09:48
閱讀 2044·2021-09-22 15:24
閱讀 1009·2021-09-06 15:02
閱讀 3303·2021-08-17 10:14
閱讀 1934·2021-07-30 18:50
閱讀 1980·2019-08-30 15:53
閱讀 3168·2019-08-29 18:43