Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Поддержка обработки исключительных ситуаций






Механизм исключительных ситуаций предоставляет пользователю возможность контроля за ходом выполнения программы и механизм нейтрализации возможных ошибок. Главное в этом механизме — поддержка действий по нейтрализации последствий события, препятствующего продолжению нормальной работы. Очень часто исключительная ситуация — это не ошибка, а просто исчерпание какого-то ресурса, например, доступной памяти или времени ожидания сигнала или даже один из предусмотренных вариантов завершения процесса. Механизм используется, если ситуация не может быть разрешена в той точке, где была выявлена, и требует перехода на более высокий уровень, с завершением каких-то активных функций и освобождением ресурсов.

Для задействования механизма особых ситуаций в программе нужно проделать следующее:

— обнаружив в программе место, где особая ситуация может возникнуть, надо придумать для неё уникальное название, например, My_Error, и объявить соответствующий класс ошибок, возможно, пустой:

class My_Error {};

— в точке программы, в которой обнаружена особая ситуация, поместить утверждение

throw My_Error;

Это утверждение создаёт объект класса My_Error. Если в объекте предусмотрены поля для данных, через них можно передать информацию обработчику ошибок: аргумент утверждения throw — это конструктор объекта;

— точку вызова функции, которая может создать исключения, нужно поместить в блок контроля, за которым следуют обработчики особых ситуаций:

try{ //начало блока контроля

вызов функции, могущей создать особую ситуацию

(содержит утверждения throw My_Error);

}

catch (My_Error)

{ обработка особой ситуации }

Предложение catch размещается на том уровне, где обработка ситуации My_Error возможна. Если нужно обрабатывать несколько различных ошибок, после блока try последовательно размещаются соответствующие обработчики. При возникновении любой особой ситуации в блоке try его работа прерывается: происходить принудительный выход из всех функций, которые были активны в точке особой ситуации и вызов деструкторов для всех созданных при этом объектов, как это происходит при выходе из блока (области видимости). Этот процесс называется раскруткой стека: стек возвращается в состояние, в котором он был при входе в блок try.

Далее просматриваются блоки catch в том порядке, в каком они объявлены. Как только обнаруживается блок обработки ошибок нужного типа, управление передаётся ему. Остальные блоки catch не используются.

Если же выполнение блока try завершилось успешно, все блоки catch после него игнорируются.

Если для некоторого типа ошибки не обнаружено соответствующего блока catch, программа завершается аварийно. Чтобы этого избежать, последним в цепочке можно разместить блок catch (…), перехватывающий ошибки любого типа.

Как только подходящий блок catch будет вызван, особая ситуация будет считаться обработанной. Поэтому этот блок может быть вообще пустым. Однако чаще всего в него помещают выдачу на экран содержательного сообщения об ошибке. Возможно также одно из следующих действий:

— устранение причины ошибки (уменьшение запроса на выделение памяти, отказ от обработки несуществующего или испорченного файла и т. п.);

— аварийное завершение программы (вызов abort ());

— перевозбуждение особой ситуации для передачи на следующий уровень иерархии (вызов throw без аргумента).

Подробнее об особых ситуациях и их обработке см. [6], с. 232–256, [7], с. 222–230, [8], с. 399–414.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.005 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал