小議Windows平臺下的異常處理

最初發表在QQ空間:Windows平臺下的異常處理

對windows平臺幾種異常處理的簡單介紹,權當拋磚引玉了。

1. UEF(UnhandledExceptionFilter): 通過SetUnhandledExceptionFilter,不需要在各個代碼處分別處理,可以爲整個應用程序安裝統一的異常處理程序,代碼的實現簡單集中。缺點是windows只負責維護一個全局函數指針,後面的SetUnhandledExceptionFilter調用會覆蓋前面的,今天的應用程序有很多都使用了這個函數,有可能導致你的代碼不能被調用。並且它的優先級最低,如果有VEH或者SEH處理了異常,UEF會什麼都不知道。詳細信息參見 理解UnhandledExceptionFilter

2. SEH,通過這種方式,每個函數都可以安裝自己的異常處理器,優先級高於UnhandledExceptionFilter,由於SEH是編譯器基於棧楨輔助實現的,象call stack一樣,SEH會層層嵌套,內層函數的SEH會先於外層的SEH被系統調用。這個看上去很美,但遺憾的是,你並不總是想這樣。舉個例子,如果你有多個線程,即使所有的異常處理過程都一樣,你也不得不在每個線程裏寫同樣的代碼來實現SEH。

3. VEH,有點類似1,在進程中提供一個統一的地方處理異常。但優先級高於SEH。缺點是XP及以後的OS才能使用這個功能。另外,windows使用鏈表記錄所有註冊的VEH,如果你的代碼中使用的第三方代碼也調用了VEH,仍然無法保證你註冊的VEH會被調用。不過這個缺點應該被無視了,因爲上述的方法都有類似的問題。既然大家都有同樣的問題,那就是沒有問題了。

異常發生時Windows按3,2,1的順序調用它們。在你的應用裏需要什麼樣的異常處理呢?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章