Windows系統異常處理

2021-05-23 18:47:28 字數 1395 閱讀 7612

在c++中使用try/catch不能捕捉作業系統丟擲的異常,如非法位址訪問、浮點異常等,而使用vc中的擴充套件特性__try/__except和__try/__finally可以捕捉這類異常.如:

int func(int i)

__except(exception_execute_handler)

return i;

}void main(void)

catch(const system_error& ex)

catch(const std::exception& ex)

}

上例中捕捉到系統異常後組裝成c++的異常,然後重新丟擲,這樣在上層的**中就可以使用標準的c++異常機制進行處理,但該特性只能在windows中使用。

這種方式隊了對作業系統的依賴性,還有一些限制,(1)在同乙個函式中不能與c++標準的try/catch同時使用(2)在__except塊中不能有需要呼叫析構函式的**,即不可以在其中進行物件的建立與銷毀;(3)它會捕捉所有的異常,包括c++可以捕捉的異常,我試圖使用如下方法將其分離,但在vs2008中重新丟擲異常後vs就不動彈了,不知何故,理論上好像沒有問題啊?!.

int func(int i)

__except(exception_execute_handler)

else throw system_error(getexceptioncode());

} return i;

}__except的三種方式處理方式:

exception_execute_handler   執行__except程式塊

exception_continue_search   系統忽略該異常處理器並在封裝的**中繼續尋找直到發現乙個異常處理器。

exception_continue_execution 系統立即歸還控制權給異常發生的地方。

使用filter函式可以對__except處理方式進行過濾,如:

#include

dword exception_filter(dword excode)

int func(int i)

__except(exception_filter(getexceptioncode()))

return i;

}這裡對於exception_int_divide_by_zero之外異常,使用了exception_continue_search的方式,而被main中的catch(const std::exception& ex)捕獲,這樣便可以實現對系統異常及c++可以捕獲的異常進行分離。

這種方式,可用於底層類的編寫,過濾掉系統級的異常,減少程式崩潰的可能性,將c++可以捕獲的異常傳遞到上層,供上層統一處理。

要獲得理詳細的資訊,需要使用getexceptioninformation( )函式。

windows 異常處理

0x00 異常處理結構 try except filter expression filter expression為以下值 exception execute handler exception continue search exception continue execution 0x01 文...

Windows 系統異常處理順序總結

首先要明白異常處理是分層的,有 1.核心異常處理 2.偵錯程式異常處理 3.程序veh 4.執行緒seh 5.系統預設的異常處理函式 unhandledexcetionfilter setunhandledexceptionfilter 來註冊新的top level exception filter...

Windows異常處理學習

一 處理過程 ntdll中的kidispatchexception函式會按兩次處理機會進行分發,過程 如果程式正在被除錯,那麼將異常交給使用者偵錯程式處理,如果沒有則跳過這一步 如果沒有偵錯程式或者偵錯程式沒有處理,將控制權返回到kiuserexceptiondispatcher函式,由它呼叫rtl...