При поиске ответа на этот вопрос я столкнулся с этим вопросом
В приложении MFC, где поставить самую верхнюю попытку/улов?
в котором говорится, что нужно переписать CWinApp :: ProcessWndProcException, чтобы поймать все исключения. Однако это работает только для исключений, которые наследуются от CException. Есть ли способ сделать это для исключений, которые наследуются от std :: exception?
В конце концов я хочу разместить "самый верхний" блок try/catch где-нибудь и показать окно сообщений всякий раз, когда этот блок try/catch получает исключение.
Как справиться с этим в переопределении CWinApp?
http://msdn.microsoft.com/en-us/library/akdx0603.aspx
Таким образом, будет класс, который переопределяет CWinApp или CWinAppEx в вашем приложении. Функция CWinApp :: Run является обработчиком сообщений. Это было бы хорошим местом, чтобы ваша попытка перехватить базовую реализацию. Вид вроде этого:
MyApp::Run(...)
{
try {
CWinApp::Run(...);
}
catch stuff ...
}
Стандартный способ уловить любое необработанное исключение в C++ - использовать std :: set_terminate(). Это будет зарегистрировать обратный вызов для вас, чтобы его уведомляли при вызове std::terminate()
, который включает случай, когда исключение не было поймано вообще.
std::set_terminate
не будет перехватывать необработанное в противном случае исключение в обычном смысле «catch» (разрешая дальнейшее выполнение).