Навигация
Главная
Поиск
Форум
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
Подключение Mic... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Организация зап... 64683
Создание потоко... 62664
Модуль Forms 61267
Создание отчето... 61239
ТЕХНОЛОГИИ ДОСТ... 57704
Пример работы с... 55212
Имитационное мо... 53097
Реклама
Сейчас на сайте
Гостей: 12
На сайте нет зарегистрированных пользователей

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

Моделирование работы участка термической обработки шестерен на GPSS + По...
моделирование процесса поступления заявок в ЭВМ на GPSS + Пояснительная ...
Обработка задач на ЭВМ на 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 Комментариев · 2349 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Работа с матрицами
Swing. Эффектные...
oTextrackBar
Изучаем Ассемблер
Программирование ...
База англоязычных...
EditNew
Просмотр коммент...
CoolControls v3.0...
Генетический алго...
ADVstatusbar
SMExport
Assistant
С/C++ Программиро...
Х. М. Дейтел, П. ...
ЯЗЫК ПРОГРАММИРОВ...
AlignEdit
Delphi 6. Учебный...
Разработка клиент...
Пример создания W...

Топ загрузок
Приложение Клие... 100386
Delphi 7 Enterp... 83602
Converter AMR<-... 20051
GPSS World Stud... 11328
Borland C++Buil... 11247
Borland Delphi ... 8186
Turbo Pascal fo... 6989
Visual Studio 2... 4970
Калькулятор [Ис... 4421
FreeSMS v1.3.1 3516
Случайные статьи
Самообучение маршр...
Удаление узлов из ...
Измерение длительн...
Комбинирование соб...
London\H RManagers...
Линии выноски для ...
СМЕШИВАНИЕ ДАННЫХ ...
пользователей,ш; с...
Новые возможности FFS
г) открытый ключ Дона
Введение в PHP
Комплект разработч...
Продолжение. Моном...
Ряды и точки
Изменение свойств ...
Эконом мебель
Установка подсветк...
Вычисление значени...
Панель инструменто...
Модерация отзывов
Достаём себе хорош...
Продажа зеркал
Функция Port Security
Вспомним первые ко...
Модификация программы
Статистика



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


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