我有一個Visual Studio 2008 C++程序,其中程序包裝在__try
/__except
區塊中以捕獲任何SEH異常。異常過濾器會創建一個錯誤日誌,並向用戶提供有關如何提交缺陷報告的詳細說明。SEH錯誤報告
過濾器中的代碼是否需要封裝在另一個__try
/__except
塊中?如果不是,如果不是,會發生什麼?如果是這樣,那應該如何處理?
static int MyFilter(struct _EXCEPTION_POINTERS* ep)
{
/*
Code to log the exception information, and instruct the user
on how to submit a defect report. Should this be in another
__try/__except block?
*/
return EXCEPTION_EXECUTE_HANDLER;
}
int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE /*hPrevInstance*/,
LPTSTR lpstrCmdLine,
int nCmdShow)
{
int result = 0;
__try
{
result = Execute(hInstance, lpstrCmdLine, nCmdShow);
}
__except(MyFilter(GetExceptionInformation()))
{
// empty
}
return 0;
}
感謝, PaulH
編輯: 如果MyFilter
引發了異常,然後我得到了一個無限循環的例外。所以,它看起來確實需要__try
/__except
處理。我看這樣做:
static int MyFilter(struct _EXCEPTION_POINTERS* ep)
{
__try
{
/*
Code to log the exception information, and instruct the user
on how to submit a defect report.
*/
// cause an exception
int x = 0, y = 1/x;
}
__except(EXCEPTION_EXECUTE_HANDLER) { /*empty*/ }
return EXCEPTION_EXECUTE_HANDLER;
}
在這種情況下,程序應該有一個異常終止和異常應傳遞到操作系統它來處理。那是對的嗎?
如果'MyFilter'產生一個異常,那麼我進入一個無限的異常循環。 – PaulH 2011-04-06 17:27:13
當然,如果它是相同的例外,你會。正如我所說,你將最終在同一個__except塊中再次調用你的過濾函數。如果過濾器在第一次拋出,它將在第二次拋出,依此類推。 – mkaes 2011-04-07 09:42:46
我似乎記得,如果在異常回調中發生未處理的SEH異常,並且它未被捕獲,則將其視爲雙重故障,並且該進程被內核終止。 – Stewart 2011-04-07 10:52:04