我正在做SEH的一些實驗。在我的代碼中,我在__try子句中寫了錯誤原因塊,在__except()中寫了一個處理程序。使用SEH時觀察到的不同行爲(結構化異常處理)
__try{
Test *pTest = 0;
int k = pTest->GetValue();
cout << "continue after exception" << endl;
}
__except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION,EXCEPTION_EXECUTE_HANDLER)
{
cout << "caught!!" << endl;
}
cout << "Exception handled" << endl;
的第二個參數__except()是其中任一 -
EXCEPTION_CONTINUE_SEARCH異常無法識別。繼續搜索堆棧中的處理程序,首先是包含try-except語句,然後是具有次高優先級的處理程序。
EXCEPTION_CONTINUE_EXECUTION異常被識別但被駁回。在發生異常的地方繼續執行。
EXCEPTION_EXECUTE_HANDLER異常被識別。通過執行__except複合語句將控制權移交給異常處理程序,然後在異常發生時繼續執行。
當我使用EXCEPTION_CONTINUE_EXECUTION/EXCEPTION_EXECUTE_HANDLER時,它不會在發生異常時繼續執行(可能是我誤解了異常發生點的含義)。 當我在調試模式下運行時,輸出爲
caught
Exception handled
當我在釋放模式運行,輸出
continue after exception
Exception handled
我不明白爲什麼它是表現不同。任何人都請幫忙。
秀的GetValue()方法的內容 – ixSci 2013-02-26 11:29:19
顯示我們Test'的'定義和展示我們如何調試和發佈選項對於SEH和C++異常不同,也有該選項。或者更好地向我們展示在發佈模式下對'__try {}'塊的反彙編。它可能有更好的線索。 – 2013-02-26 11:31:10
,我怕'pTest'是一個指向類,它可能不需要爲了執行'的GetValue(被取消引用)'和編譯器認識到,當優化在釋放模式被啓用。或者,甚至可能將'GetValue()'看作無用的,並且不會生成任何代碼來調用它。編譯器也可能會發現,取消引用NULL指針會導致未定義的行爲,並決定在編譯時通過擰你的代碼來懲罰它,它完全有權這樣做。 'gcc'因爲這樣做而臭名昭着。 – 2013-02-26 11:53:05