以前寫了篇文章 Windows平台下的異常處理 討論了Window平台下的一些異常處理方式,然而,簡單的把SEH和UEF並列,並不是十分合適,它們並不在一個層級上,UEF相當於SEH架構中的ExceptionFilter運算式,SEH和UEF都屬於SEH架構,走同樣的異常分發流程,因此實現的功能也類似。OS和CRT的UEF安裝在最外面,使用者的SEH安裝在裡面,2者工作範圍不同。
SEH的ExceptionFilter運算式和UEF允許使用者有3個選擇,參見MSDN:http://msdn.microsoft.com/en-us/library/ms680634(v=vs.85).aspx,即
EXCEPTION_EXECUTE_HANDLER
EXCEPTION_CONTINUE_EXECUTION
EXCEPTION_CONTINUE_SEARCH
事實上,從代碼實現看,SEH是使用者自己定義Filter,而UEF是通過OS已經實現的
UnhandledExceptionFilter 調用的,並且由OS或CRT封裝了異常處理代碼。如開頭所說,它們走同樣的異常分發流程,
如果SEH的Filter返回 EXCEPTION_EXECUTE_HANDLER,SEH中的異常處理塊會執行,實現代碼的飛越,類似於Goto。
由於UEF是由OS或者CRT封裝過的,當UEF返回 EXCEPTION_EXECUTE_HANDLER 時,OS或者CRT中的異常處理過程得以執行,一般是ExitProcess或者TerminateProcess,終止進程。
SEH和UEF返回EXCEPTION_EXECUTE_HANDLER,都會導致stack unwind。
SEH和UEF的其它資訊可以參見大牛的文章:
A Crash Course on the Depths of Win32 Structured Exception Handling
順便說下VEH,VEH只允許使用者給出2個選擇,參見MSDN:http://msdn.microsoft.com/en-us/library/ms681419(v=vs.85).aspx,即
EXCEPTION_CONTINUE_EXECUTION
EXCEPTION_CONTINUE_SEARCH
VEH是Windows XP開始引入的功能,不支援EXCEPTION_EXECUTE_HANDLER功能,因此也沒有相應的global/local unwind功能。