[英]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.