C++

Глобальная обработка исключений в С++

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

Для перехвата глобальных исключений существуют две функции:


_set_purecall_handler — устанавливает callback функцию для обработки событий связанными с вызовов чисто виртуальных функций. Если в эту функцию передать NULL, то вы сбросите этот обработчик. Обработчик является глобальным для всех используемых в приложении dll. Это значит, что повторный вызов функции перетрет предыдущий вызов.

SetUnhandledExceptionFilter — устанавливает обработчик для исключений, т.е. Structured Exception Handling(SEH). Этот обработчик перехватит все исключения, которые не будут обработаны программистом при помощи конструкций try-catch. Этот обработчик так же глобальный и будет перетираться загрузкой некоторых dll.

Эти обработчики перехватят исключения, которые произошли в любых потоках.

Использовать эти методы можно так:

//
LONG __stdcall MainExceptionHandler( EXCEPTION_POINTERS* exceptionInfo )
{
	// обработка данных с использованием exceptionInfo 
	// ...
	return EXCEPTION_CONTINUE_SEARCH;
}
//
void MainOnPureCallHandler( void )
{
	MessageBoxA( NULL, "Application just crashed!\n\nError: Pure virtual call!", "Application error.", MB_OK | MB_ICONERROR );
	_exit( 0 );
}

// Это нужно выполнить сразу после старта приложения
// Устанавливаем callback функции для обработки исключительных ситуаций
_set_purecall_handler( MainOnPureCallHandler );
SetUnhandledExceptionFilter( MainExceptionHandler );

// Это нужно выполнить перед завершением приложения
SetUnhandledExceptionFilter( NULL );
_set_purecall_handler( NULL );


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

Есть статья по решению такой же задачи в C#: Глобальная обработка исключений в C#

Похожие записи




Комментарии (0)

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.

Warning: Unknown: write failed: No space left on device (28) in Unknown on line 0

Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php5) in Unknown on line 0