2012-01-27 61 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

相关问题