Страница 31 из 51 Перехват ошибок 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); |