У нас возникли проблемы с тем, что Windows молча использует исключения и позволяет приложению продолжать работу, когда исключение выдается внутри модуля обработки сообщений. Например, мы создали тестовое приложение MFC MDI и переопределили OnDraw:
void CTestView::OnDraw(CDC* /*pDC*/)
{
*(int*)0 = 0; // Crash
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: add draw code for native data here
}
Можно ожидать неприятного сообщения об ошибке при запуске приложения, но на самом деле вы ничего не получаете. Программа работает отлично, но если вы проверите окно вывода, то увидите:
Исключение первого шанса в
0x13929384 в Test.exe:
0xC0000005: Запись о нарушении доступа
местоположение 0x00000000.
Исключение первого шанса в 0x77c6ee42
в Test.exe: 0xC0150010:
контекст активации деактивирован
не активен для текущего потока
исполнения.
Я знаю, почему я получаю исключение контекста приложения, но почему оно обрабатывается без вывода сообщений? Это означает, что наши приложения могут испытывать серьезные проблемы при использовании, но мы никогда не узнаем об этом, потому что наши пользователи никогда не сообщат о каких-либо проблемах.