所以我試圖寫一些取消參考未知指標并回傳操作狀態的東西,如下所示:
int n;
__try {
n = *(int*)(addr); // The unknown address.
}
__except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
printf("Exception caught!\n");
}
現在這段代碼甚至一開始都沒有捕捉到例外,所以 VS 除錯器反而捕捉到了它。所以我很好奇,做了一個簡單的試運行:
__try {
RaiseException(EXCEPTION_ACCESS_VIOLATION, NULL, NULL, nullptr);
}
__except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
printf("Exception caught!\n");
}
這產生了與其他代碼塊相同的結果。雖然我已經撰寫了數百次上面的代碼塊,但我真的不確定為什么 __try 會突然假裝它根本不存在。是的,我檢查了我的編譯器設定。它們設定為使用 /RTC1 進行編譯。
uj5u.com熱心網友回復:
正如@Hans Passant 所說,行程的除錯器可以在基于幀的例外處理程式(我檢查過)之前捕獲例外。
RaiseException列出了一個例外處理程式序列。
- 系統首先嘗試通知行程的除錯器(如果有)。
- 如果行程沒有被除錯,或者關聯的除錯器沒有處理例外,系統會嘗試通過搜索發生例外的執行緒的堆疊幀來定位基于幀的例外處理程式。系統首先搜索當前堆疊幀,然后向后遍歷之前的堆疊幀。
- 如果找不到基于幀的處理程式,或者沒有基于幀的處理程式處理例外,系統會再次嘗試通知行程的除錯器。
- 如果行程沒有被除錯,或者關聯的除錯器沒有處理例外,系統會根據例外型別提供默認處理。對于大多數例外情況,默認操作是呼叫 ExitProcess 函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/419796.html
標籤:
