Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 62784
Создание отчето... 62766
ТЕХНОЛОГИИ ДОСТ... 59300
Пример работы с... 58008
Имитационное мо... 54678
Реклама
Сейчас на сайте
Гостей: 7
На сайте нет зарегистрированных пользователей

Пользователей: 13,071
новичок: virtualight
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Расчет мер близости на отношениях на Delphi + Пояснительная записка
Моделирование работы обрабатывающего участка цеха в GPSS
Моделирование процесса поступления заявок в систему, состоящую из трёх Э...

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Подмена функций стандартного завершения
Стандарт (см. п. 18.6 в [1]) позволяет подменить вызов стандартной функции terminate() функцией, определенной программистом. Как уже было сказано, эта функция вызывается либо из функции unexpected(), если нарушена спецификация исключения, либо механизмом обработки исключений, если отсутствует подходящая секция-ловушка. Аналогично можно подменить и вызов функции

unexpected (). В стандартной библиотеке (надо подключить заголовок exception >) прописаны следующие объявления:
typedef void (*unexpected_handler)();
unexpected_handler set_unexpected(unexpected_handler f) throw(); void unexpectedO ;
typedef void (*terminate_handler)();
terminate_handler set_terminate(terminate_handler f) throwQ; void terminateO ;



Эти объявления показывают, что для подмены стандартной функции terminateO мы должны определить собственную функцию с прототипом
void F():



Затем нужно прописать ее имя в вызове функции
set_terminate(): set_terminate(F);



Можно сохранить адрес прежнего обработчика:
void (*old__terminate) () = set_terminate(F);



После этого вместо termi nate () при обработке неперехваченных исключений будет вызываться наша функция F (). Простой пример демонстрирует это (листинг 7.18). Исполнять его необходимо из командной строки, так как при запуске в интегрированной среде она (среда) перехватывает все необработанные исключения.
Листинг 7.18. Подмена функции
terminateO void f ()
{ cout << "Неперехваченное исключение!" << endl: } int main()
{ set_terminate(f): // установка нашей функции
try { throw 1; } // генерация неперехватываемого исключения
catch(double) {}; return 0:
}



При трансляции в системе Visual C++.NET 2003 на экране появятся следующие сообщения:
Неперехваченное исключение!



This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information.
Первое сообщение, очевидно, наше. А вот следующие два — это то, что система вставляет в нашу программу при трансляции исходного текста.
Система С++ Builder 6 ведет себя немного иначе — на экране появляются сообщения:
Неперехваченное исключение! Abnormal program termination
Последнее сообщение — это сообщение стандартной функции завершения abort () (см. п. 18.3 в [1]).
Функция-«терминатор» не должна возвращать управление оператором return, не должна генерировать исключение оператором throw — она может лишь завершить программу функцией exit() или abort(). Но перед завершением можно выполнить действия, которые позволят разобраться в причине вызова «терминатора», например, сохранить информацию об ошибке в файле.
Аналогично реализуется подмена стандартной функции unexpectedO, только надо вызвать другую функцию set_...:
set_unexpected(f); // установка нашей функции
Функция обработки неперехваченного исключения, как и функция-терминатор, не должна возвращать управление оператором return и может завершить программу функцией exit() или abort(). Однако помимо этого она может сгенерировать исключение, заданное в спецификации исключений. Произойдет подмена неперехваченного исключения «легальным», и далее обработка исключений пойдет «нормальным» путем.
Функция может сгенерировать другое исключение, не указанное в спецификации, или просто «отправить» незаявленное исключение «дальше» оператором throw. В этом случае, если в спецификации исключений отсутствует исключение bad_exception, вызывается функция terminate(). А вот если спецификация исключений содержит исключение bad__exception, то сгенерированное исключение подменяется на bad_exception и начинается поиск его обработчика.
Как использовать подмену функции unexpectedO с пользой — показал Скотт Мейерс в [24]. Так как предвидеть тип неожиданного исключения невозможно, предлагается подменить все неперехваченные исключения одним типом: либо стандартным исключением bad_exception, либо нашим собственным типом, например UnexpectedException. Первый вариант реализуется функцией
void convertUnexpectedToBad_Exception()
{ throw; // генерация bad_exception
}
set_unexpected(convertUnexpectedToBad_Exception);
Второй вариант реализуется так:
// наше исключение
// генерация нашего исключения
class UnexpectedException {}; void convertUnexpectedO { throw UnexpectedExceptionO; }
set_unexpected(convertUnexpected);






Во все спецификации исключений функций надо включить соответствующий тип — и можно забыть о неожиданных исключениях.
Опубликовал Kest November 14 2013 03:25:05 · 0 Комментариев · 2429 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Delphi 2006 - Спр...
Работа с базами д...
Последнее загруж...
Delphi. Учимся на...
Visual Basic for ...
Delphi 2005 Секре...
PBEditPack
100 компонентов о...
Delphi World 6.0
Animated Menus
Задача о 8ми ладьях
Pass [Исходник на...
TDBF
CS:Source - монит...
Java 2 - Эффектив...
Язык программиров...
C++ для начинающих
Пример работы с ф...
OnlineIP
Керниган Б.В., Ри...

Топ загрузок
Приложение Клие... 100420
Delphi 7 Enterp... 84878
Converter AMR<-... 20061
GPSS World Stud... 11934
Borland C++Buil... 11401
Borland Delphi ... 8362
Turbo Pascal fo... 7007
Visual Studio 2... 4983
Калькулятор [Ис... 4618
FreeSMS v1.3.1 3529
Случайные статьи
Свойства языка C++...
Шинная архитектура
Описание сигналов ...
Задачи управления ...
Описание основных ...
Работа с плагинами...
Полиморфизм на эта...
6.11. Вычисление ...
16-2)
Распространенные о...
Нерекурсивное вычи...
Безопасное програм...
Ремонт холодильник...
Источник данных
Классы в PHP3
( windowsupdate
Сложное масштабиро...
Кодирование видеоп...
Процедура Ваr3D - ...
Поиск элемента
Целые числа в диап...
ЦЕЛЬ: ПОЛУЧЕНИЕ СТ...
IP адрес, его опре...
Создание значка ко...
Обработка транзакц...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?