結構化異常

終止處理程序
      1. (structured exception handling, SEH)結構化異常處理。
      不同的編譯器針對SEH的實現不盡相同,這裏採用Microsoft Visual C++ 編譯器規定的語法。
      說明:不要混淆結構化異常處理與C++異常處理,c++異常處理在形式上表現爲使用關鍵字catch和throw,這和結構化異常處理的形式不同。Microsoft Visual c++支持異常處理,它在內部實現上其實就是利用了編譯器和windows操作系統的結構化異常處理功能。
      SEH實際上包含兩方面的功能:終止處理(termination handling)和異常處理(exception handling).

       形式:_try {......}_finally{......}。_leave

注意:如果一個“棧耗盡異常”(stack exhaustion exception)發生在try代碼塊裏,finally塊就很可能得不到運行的機會,因爲運行在出錯進程裏的WER代碼都可能沒有足夠的棧空間去報告錯誤,所以在這種情況下,進程往往是不加任何提示地被終止。還有如果異常導致SEH鏈的中斷,終止處理程序也不會得到執行。最後如果異常發生在異常過濾程序裏,終止程序也不會得到執行。一條經驗法則則是儘量限制在catch或者finally塊中代碼所做的工作。儘管絕大部分情況下,try塊中的提前退出都會被終止程序所捕獲,但是在進程或者線程被提前終止的情況下,系統沒法保證finally代碼塊的執行。(abort內部調用的是ExitProcess).

      2. 內在函數是由編譯器所識別並處理的特殊函數。編譯器會爲這個函數生成內聯代碼,而不是生成代碼來調用這個函數,比如,memcpy是內在函數(如果打開編譯開關/0i)。當編譯器見到對memcpy的調用,它會直接將memcpy的代碼放置到memcpy的函數裏,而不是生成調用memcpy的代碼,這樣做通常讓程序運行的更快,但體積更大。內在函數AbnormalTermination和memcpy的區別在於它只會以內置這一種形式存在。任何c/c++動態運行庫都沒有這個函數。我們只能在finally塊裏調用AbnormalTermination函數,它將返回一個布爾值來表明一個與當前finally塊相關的try是否已經提前退出。異常TRUE.

 

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