Delphi異常機制與SEH書呆子介紹SEH機制的文章很多,但基本都是C++的,關於Delphi的很少。最近項目需要,仔細閱讀了VCL關於異常的處理,有些心得體會,希望和大家一起分享。
SEH簡介 SEH(struct exception handling)結構化異常處理是WIN32系統提供一種與語言無關的的異常處理機制。編程語言通過對SEH的包裝,使程序異常處理更加簡單,代碼結構更加清晰。常見的如,Delphi用到的 try exception end, try finally end,C++用到的_try{} _finally{} 和_try{} _except {} 結構都是對SEH的包裝。
SEH提供了兩種方式供開發者使用,一種是線程級的,通過設置線程的SEH鏈表結構。線程的TIB信息保存在FS:[0],而TIB的第一項就是指向SEH鏈表,所以,FS:[0]就是指向SEH鏈表,關於SEH結構後面介紹。第二種是進程級的,通過API函數SetUnhandledExceptionFilter設置過濾器函數來獲取異常,注意的是,這種方式只有在前面的異常機制都不予以處理的時候才會被觸發。
關於更詳細的SEH相關內容,請參見大牛Matt PIEtrek的文章:
A Crash Course on the Depths of Win32 Structured Exception Handling (原文)
A Crash Course on the Depths of Win32 Structured Exception Handling (翻譯)
SEH鏈表的結構如下: