簡體   English   中英

python如何在塊例外情況下捕獲自定義異常?

[英]How does python catch custom exceptions in except block cases?

假設我有以下自定義異常。

class CustomException(TypeError):
    def __init__(message, code):
        super().__init__(f'{code}: message')
        self.code = code

python如何在以下代碼中知道何時捕獲我的異常?

try:
    x = doSomething(a, b, c)
except CustomException:
    raise

當我實現doSomething()函數時,是否必須顯式拋出CustomException以使其被捕獲? 就像,對於內置的異常類,代碼可以拋出諸如KeyError之類的異常,並且我們在使用字典進行操作時不必顯式地聲明raise KeyError

任何引發異常的代碼都明確地這樣做,包括KeyError 與內置類型相比,自定義異常不需要特殊處理。 try...except僅可在try內任何語句執行的代碼引發異常的情況下捕獲該異常。 這包括任何其他函數調用,這些調用鏈接在一起成為一個調用堆棧。

在下面的例子中

>>> d = {}
>>> d['foo']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'foo'

KeyError並非一無是處,Python dict實現顯式引發了該異常。 這可能並不總是很明顯,因為本機代碼(此處是用C實現的代碼)未顯示在Python追溯中。

對於d[...]訂閱操作, dict_subscript()函數調用_PyErr_SetKeyError(key); ,這是一個使用PyErr_SetObject()的幫助程序函數, PyErr_SetObject()的C語言等效於raise引發KeyError(key)異常的raise。

捕獲異常對於所有異常類型都相同,自定義異常在此並不特殊。 引發異常時,正常的代碼流被中斷,並且取消調用堆棧,直到遇到活動的try語句為止,然后按照源代碼中定義的順序使用isinstance(active_exception, ExceptionClassBeingHandled)測試任何異常處理程序。

如果沒有異常捕獲到異常,Python將繼續展開調用堆棧,直到到達最后一個堆棧幀為止,此時如果沒有異常捕獲到異常,Python將退出並帶有堆棧跟蹤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM