在MFC应用程序中,哪里放置最顶层的try / catch?

时间:2012-01-27 17:11:17

标签: exception 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对话框的应用程序,并在Release x64中编译,我在Windows 7上。 我在std::exception方法中抛出OnTimer(将字符串传递给构造函数),如果没有块,我会得到csrss.exe使用此通用消息创建的消息框

  

“异常未知软件异常(0x40000015)发生在   应用程序位于0x5dff61c9。“

     

“点击确定终止程序”

     

“点击取消调试程序”

消息框不会报告我附加到异常的字符串,因此它没那么有用。 我想我得到了消息框而不是花哨的TaskDialog,因为我禁用了Windows错误报告服务并重命名了WerFault.exe。

也许我必须忘记自己的消息框,我需要接受新的Windows错误报告?

1 个答案:

答案 0 :(得分:2)

在MFC应用程序中处理未处理异常的正确方法是覆盖CWinApp::ProcessWndProcException

您可能只想处理某些异常类型。如果要在某些情况下回退默认行为,请调用基本实现。如果您不打电话给基地,您的应用程序将不会关闭。

如果要显示自定义错误消息,然后在避开默认消息时关闭,请显示消息框,然后在主框架/对话框上调用DestroyWindow