我想向try {} catch {}
塊和堆棧跟蹤如何工作的內部工作。`try/catch`如何在細節中工作
我讀this great article about exception handling anti-patterns,發現以下段落:
catch (NoSuchMethodException e) { throw new MyServiceException("Blah: " + e.getMessage()); }
這破壞了原始異常的堆棧跟蹤,並永遠是錯的。
之後,我才意識到,我並不真的知道如何try/catch
作品。我的理解如下。請看例子:
void top() {
try {
f();
} catch (MyException ex) {
handleIt();
} finally {
cleanup();
}
}
void f() {
g();
}
void g() {
throw new MyException();
}
當我打電話top()
,調用鏈top -> f -> g
留下了兩個stack frames調用堆棧上(對於top
和f
功能)。當在g
, 中引發異常時,程序會啓動執行堆棧,直到找到處理異常的try/catch
塊爲止。同時它釋放堆棧幀並將堆棧跟蹤信息附加到一些可以傳遞到catch
的「魔術」對象,並且可以打印堆棧跟蹤。
它如何知道被調用的函數被try/catch塊「包圍」?這個信息綁定到堆棧幀嗎?就像一個指向錯誤處理塊的指針(某些開關選擇一個匹配的塊catch
)和一個指向finally
塊的指針?爲什麼e.getMessage()
在上述示例中具有破壞性(請參閱評論)?
注意,我知道如何使用try/catch語句和例外情況,我想知道它是如何工作內。
嗯,你說得對,我沒有注意到'throw' :)但剩餘的問題仍然有效 –