C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Подробности - Перехват ошибок set_terminate / MFC в подробностях / Visual C++

Подробности - Перехват ошибок set_terminate

Ну как бы мы классно не программировали и сколько бы сил не тратили все равно программа где-нибудь ошибется. Скажет "Опаньки" операция была некорректная мол и я все закрою. Хотелось чтобы это было не совсем так. То есть, если программа и совершит ошибку, то хоть какие-нибудь действия предпринять по этому поводу.

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

// eh.h
typedef void (*terminate_function)();
terminate_function set_terminate( terminate_function term_func );

Вот как можно это сделать просто:

#include "stdafx.h"
#include "iostream.h"
#include "eh.h"


void  Error()
{
	cout << "Error !!!!! " << endl;
}

void main()
{
	set_terminate(Error);
	throw "df";
	cout << "Cancel" << endl;
}

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

Сама функция возвращает указатель на предыдущую функцию обработки и его можно сохранить и использовать.

typedef void (*TERMINATE_FN)();
TERMINATE_FN old_terminate = NULL;
......
old_terminate = set_terminate(my_terminate);
......
set_terminate(old_terminate);

| |
Автор Каев Артем.
[AD]