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

Ale*_*son 5 mfc exception 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 );
Run Code Online (Sandbox Code Playgroud)

但是,我可以把块放在哪里呢?我使用 Visual Studio 2010 创建了一个基于 MFC 对话框的应用程序,并在 Release x64 中编译了它,我使用的是 Windows 7。我std::exception在方法中抛出一个(将字符串传递给构造函数)OnTimer,如果没有该块,我会收到一个由csrss.exe与此通用消息

“应用程序中发生了未知软件异常 (0x40000015),位置为 0x5dff61c9。”

“单击“确定”终止程序”

“点击取消调试程序”

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

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

Aid*_*yan 3

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

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

如果您想显示自定义错误消息然后关闭,同时避免显示默认消息,请显示消息框,然后调用DestroyWindow主框架/对话框。