Навигация
Главная
Поиск
Форум
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
Создание отчето... 65467
Модуль Forms 65224
Пример работы с... 64769
ТЕХНОЛОГИИ ДОСТ... 61928
Имитационное мо... 57799
Реклама
Сейчас на сайте
Гостей: 10
На сайте нет зарегистрированных пользователей

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

Диплом - база данных поставщиков на Delphi (MS Sql Server)+ Пояснительна...
Моделирование процесса обработки заданий на вычислительном центре на GP...
База данных - рабочее место кассира на Delphi + бд Access

Реклама



Подписывайся на 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 Комментариев · 2567 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Dynamic Titles дл...
Профессиональное ...
Система баннеро...
Переработанный пл...
32 урока по Delphi
С# для профессион...
Ведение справочны...
Geo-Whois
Illusion
Visual Studio 200...
Gold Submitter II...
Конвертирование и...
Fig [Исходник на ...
Ранги для форума
Borland Delphi 8 ...
Архив программ
Battle.Net - мони...
Berg
TelBook
База англоязычных...

Топ загрузок
Приложение Клие... 100470
Delphi 7 Enterp... 87111
Converter AMR<-... 20078
GPSS World Stud... 12865
Borland C++Buil... 11849
Borland Delphi ... 8609
Turbo Pascal fo... 7039
Visual Studio 2... 4999
Калькулятор [Ис... 4806
FreeSMS v1.3.1 3542
Случайные статьи
Теплоизоляционный ...
Выбор технологии
Комментарии
Настенные часы
Как слать письма в...
Блок QUEUE
(Request Security)...
таблицы Authors
Размер фотографий ...
Объекты имеют стат...
Перспективы исслед...
Какие есть четыре ...
Приведенный ниже и...
Создание манипулят...
Искусственное подн...
Разработать процед...
Возможности окружения
• Enable Content R...
Следует ли защищат...
Защита изображений...
Параметры шаблонов
Сортировка методом...
службы поддержки в...
Wildcard О.О.О.О. ...
Песчаник
Статистика



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


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