2012-01-27 29 views
4

在MFC應用程序中,放置最頂端的try/catch的位置?在MFC應用程序中,放置最頂端的try/catch的位置?

我有一個MFC應用程序,我想捕獲所有異常並顯示我自己的消息框。

這是我最頂層try/catch塊的想法:

try 
{ 
    // What enclose here? Or, where to put this try/catch block? 
} 
catch(const std::exception& e) 
{ 
    ::MessageBox(0,e.what(),"I do not know hot to handle this exception, I will terminate",MB_OK); 
} 
catch(...) 
{ 
    ::MessageBox(0,"Unknown Excpetion","I do not know hot to handle this exception, I will terminate",MB_OK); 
} 
::TerminateProcess(::GetCurrentProcess(), -1); 

但是,我在哪裏可以把塊?我使用Visual Studio 2010創建了一個基於MFC對話框的應用程序,並將其編譯爲版本x64,我在Windows 7上。 我在OnTimer方法中拋出了std::exception(將字符串傳遞給構造函數),並且沒有獲得塊通過csrss.exe與此一般性消息

創建的消息框「中的未知軟件異常(0x40000015)在 應用發生在位置0x5dff61c9。」

「單擊確定以終止程序」

「點擊取消來調試程序」

消息框不報告我連接到異常的字符串,所以它不是非常有用。 我想我得到的消息框而不是一個花哨的TaskDialog,因爲我禁用了Windows錯誤報告服務並重命名WerFault.exe。

也許我必須忘記我自己的消息框,我需要擁抱新的Windows錯誤報告?

回答

2

處理未處理的MFC應用程序異常正確的方法是通過覆蓋CWinApp::ProcessWndProcException

你可能只想處理某些異常類型。如果您想在某些情況下回退默認行爲,請調用基本實現。如果你不打電話給基地,你的應用程序不會關閉。

如果要顯示自定義錯誤消息,然後在避免默認消息的同時關閉,請顯示消息框,然後在主框架/對話框中調用DestroyWindow

+0

嗨,這是唯一的調用,如果一個CException變得無法處理?有沒有辦法爲用戶定義的異常類提供類似的行爲? 謝謝! – NHDaly 2013-11-26 22:08:38

+0

任何繼承CException的未處理的異常都將在'ProcessWndProcException'中處理。很容易在代碼中測試它。 – 2013-11-26 22:45:35

+0

好的,謝謝。 (是的,我很抱歉;我現在不在Windows機器上)。但是,你是否知道如何能夠提供相同的行爲,但是對於用戶定義的異常類? 謝謝! – NHDaly 2013-11-26 22:53:32

相關問題