В приложении MFC, где разместить самый лучший try / catch? - PullRequest
4 голосов
/ 27 января 2012

В приложении MFC, куда поместить самую верхнюю попытку / улов?

У меня есть приложение 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 );

Но где я могу разместить блок?Я создал приложение на основе диалогового окна MFC с Visual Studio 2010 и скомпилировал его в Выпуске x64, я в Windows 7. Я выбрасываю std::exception (передавая строку в конструктор) в методе OnTimer и без блока Iполучить окно сообщения, созданное csrss.exe с этим общим сообщением

"Исключение неизвестного программного обеспечения (0x40000015) возникло в приложении в расположении 0x5dff61c9."

"Нажмите кнопку ОКчтобы завершить программу "

" Нажмите ОТМЕНА для отладки программы "

В окне сообщения не отображается строка, которую я прикрепил к исключению, и поэтому она не так полезна.Я думаю, что получаю окно сообщения вместо причудливого TaskDialog, потому что я отключил службу отчетов об ошибках Windows и переименовал WerFault.exe.

Может быть, я должен забыть свое собственное окно сообщения, и мне нужно принять новую WindowsСообщение об ошибке?

1 Ответ

2 голосов
/ 28 января 2012

Правильный способ обработки необработанных исключений в приложении MFC - переопределение CWinApp::ProcessWndProcException

Возможно, вы захотите обрабатывать только определенные типы исключений. Если вы хотите использовать поведение по умолчанию при некоторых обстоятельствах, вызовите базовую реализацию. Если вы не позвоните на базу, ваше приложение не будет закрыто.

Если вы хотите отобразить пользовательское сообщение об ошибке, а затем завершить работу, избегая сообщения по умолчанию, откройте окно сообщения и затем вызовите DestroyWindow в главном окне / диалоговом окне.

...