Навигация
Главная
Поиск
Форум
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
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 11
На сайте нет зарегистрированных пользователей

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

Моделирование ЭВМ на GPSS (три класса заданий) + Пояснительная записка
Моделирование регулировочного участка цеха на GPSS + Пояснительная записка
Файл записей с выводом обратного заголовка на Turbo Pascal

Подмена функций стандартного завершения
Стандарт (см. п. 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 13 2013 23:25:05 · 0 Комментариев · 3565 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
EditNew
Pro-Download Sys...
CwstatusBar
SMLPack v1.0
Srinilist
Быстрое создание ...
Run
Профессиональное ...
DateEdit
RAS
База данных фильм...
Delphi 2005 для .NET
Java 2 - Эффектив...
XPcontrol
AntiRus
Анимированное поя...
Сапёр
StartMark
Image Browser [Ис...
XPATComponents

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97832
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10290
Turbo Pascal fo... 7373
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Развлечения на сай...
Создание дополните...
Выигрышные качеств...
Клуб вулкан — подк...
Просмотр техническ...
Целые числа со зна...
Дополнительные сфе...
Обзор ассоциативны...
Настройка страницы
Предварительные св...
TGT для KDCw2k
Настройки обсуждения
Сетевой инженер со...
Процедура Rectangl...
Программа формиров...
Параметр DEFAULT (...
Даны m натуральных...
Стратегии эффектив...
Применяйте AsyBEUI...
Вычислительная сто...
вступали в силу в ...
Мультиаккаунты в о...
Установка и удален...
Язык С: обработка ...
Строки в стиле С о...
Статистика



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


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