等同於 「How do exceptions work (behind the scenes) in C++」,但對於C#。如何例外在C#中工作(幕後)
我知道在拋出異常時必須執行下面的步驟。
- 查找異常類型最接近的處理程序;
- 展開堆棧直至處理程序級別;
- 調用處理程序;
- 查找並致電每個
finally
塊。
如何處理.NET這些操作? 「當前」處理程序的映射如何工作?在try/catch塊中發出多少代碼?並在一個投擲塊?
等同於 「How do exceptions work (behind the scenes) in C++」,但對於C#。如何例外在C#中工作(幕後)
我知道在拋出異常時必須執行下面的步驟。
finally
塊。如何處理.NET這些操作? 「當前」處理程序的映射如何工作?在try/catch塊中發出多少代碼?並在一個投擲塊?
閱讀Christopher Brumme的文章;它給人的CLR異常處理幕後發生的事情很詳細的解釋:
http://blogs.msdn.com/b/cbrumme/archive/2003/10/01/51524.aspx
在Windows .NET異常使用OS」底層Structured Exception Handling(SEH)機制,以同樣的方式爲本地代碼。如linked question for C (and C++)中所列。
.NET異常使用結構化異常處理實現基本的Windows,雖然這不是一個要求。單聲道可能會有所不同。
事實上,如果你寫了一個單行控制檯應用程序,只是拋出一個異常,然後在WinDbg中運行它,你會看到勾入非託管異常處理。
你能否提供一些關於Mono實現的具體參考,我想了解一下。 – Maniero 2017-10-09 18:56:19
@Maniero我對Mono的實現一無所知。 – 2017-10-09 21:30:04
你錯過了幾個步驟,至少包括:是否有安裝任何異常過濾器(他們涉足的前捕獲塊),並在堆棧展開時執行任何最終塊。 – 2010-09-21 14:45:24
的確,我忘了最後的塊。讓我糾正一下。 – jpbochi 2010-09-21 16:31:50