2010-09-21 39 views
16

等同於 「How do exceptions work (behind the scenes) in C++」,但對於C#如何例外在C#中工作(幕後)

我知道在拋出異常時必須執行下面的步驟。

  1. 查找異常類型最接近的處理程序;
  2. 展開堆棧直至處理程序級別;
  3. 調用處理程序;
  4. 查找並致電每個finally塊。

如何處理.NET這些操作? 「當前」處理程序的映射如何工作?在try/catch塊中發出多少代碼?並在一個投擲塊?

+3

你錯過了幾個步驟,至少包括:是否有安裝任何異常過濾器(他們涉足的前捕獲塊),並在堆棧展開時執行任何最終塊。 – 2010-09-21 14:45:24

+0

的確,我忘了最後的塊。讓我糾正一下。 – jpbochi 2010-09-21 16:31:50

回答

3

.NET異常使用結構化異常處理實現基本的Windows,雖然這不是一個要求。單聲道可能會有所不同。

事實上,如果你寫了一個單行控制檯應用程序,只是拋出一個異常,然後在WinDbg中運行它,你會看到勾入非託管異常處理。

+0

你能否提供一些關於Mono實現的具體參考,我想了解一下。 – Maniero 2017-10-09 18:56:19

+0

@Maniero我對Mono的實現一無所知。 – 2017-10-09 21:30:04