Прерывание (interrupt) – это прекращение выполнение текущей команды или текущей последовательности команд для обработки некоторого события специальной программой – обработчиком прерывания (interrupt handier), с последующим возвратом к выполнению прерванной программы. Прерывание используется для быстрой реакции процессора на особые ситуации, возникающие при выполнении программы и взаимодействии с внешними устройствами.
Различают следующие типы прерываний:
Внешние прерывания – происходят асинхронно, т.е. происходят в случайный момент времени в процессе выполнения программы (например, от внешних устройств: других ЭВМ, аварийных и некоторых других датчиков технологического процесса).
— маскируемые*, которые могут быть замаскированы программными средствами компьютера
— немаскируемые, запрос от которых таким образом замаскирован быть не может.
(* Маска прерывания – представляет собой двоичный код, разряды которого поставлены в соответствие запросам или классам прерывания. Маска загружается командой программы в регистр маски. Состояние 1 в данном разряде регистра маски разрешает, а состояние 0 запрещает (маскирует) прерывание текущей программы от соответствующего запроса.
Фильм недавно вышел! МОДЕЛЬ СЧАСТЛИВОЙ ЖИЗНИ Мелодрамы новинки, фильмы HD
Внешние аппаратные прерывания инициируются контроллерами периферийного оборудования. Источники сигналов прерываний подключаются либо к выводу немаскируемых прерываний процессора (NMI), либо к выводу маскируемых прерываний (INTR). Линия NMI обычно предназначается для прерываний, вызываемых катастрофическими событиями, такими как, ошибки четности памяти или авария питания.
Прерывания от внешних устройств поступают в процессор через специальное устройство – программируемый контроллер прерываний PIC. Центральный процессор управляет контроллером через набор портов ввода-вывода, а контроллер в свою очередь сигнализирует процессору через вывод INTR. PIC предоставляет возможность программно разрешать и запрещать прерывания от конкретных устройств, а также назначать им приоритеты. Изготовители компьютерных систем так же, как и изготовители периферийного оборудования, назначают внешним устройствам определенные уровни приоритетов контроллера прерываний. Эти назначения выполняются в виде физических электрических соединений и не могут быть изменены программным образом.
Внутренние прерывания – происходят синхронно, т.е. возникают по конкретной причине и можно предугадать возникновение такого прерывания. Например, при делении на ноль, появление ошибки в работе аппаратуры самой ЭВМ, переполнение разрядной сетки, выход из установленной для данной программы области памяти, затребование периферийным устройством операции ввода-вывода, завершении операции ввода-вывода периферийным устройством или возникновение при этой операции особой ситуации и др.
Программные прерывания – вызываются следующими ситуациями:
— особый случай, возникший при выполнении команды и препятствующий нормальному продолжению программы (переполнение, нарушение защиты памяти, отсутствие нужной страницы в оперативной памяти и т.п.)
Без лица: воспитатель детского сада рассказывает правду о работе
— наличие в программе специальной команды прерывания INT n, используемой обычно программистом при обращении к специальным функциям операционной системы для ввода-вывода информации.
ОРГАНИЗАЦИЯ ПРЕРЫВАНИЙ.
Любая особая ситуация, вызывающая прерывание, сопровождается сигналом, называемым запросом прерывания. Запросы прерываний от внешних устройств поступают в процессор по специальным линиям, а запросы, возникающие в процессе выполнения программы, поступают непосредственно изнутри микропроцессора. Механизмы обработки прерываний обоих типов схожи.
Каждому запросу прерывания в компьютере присваивается свой номер (тип прерывания), используемый для определения адреса обработчика прерывания.
При поступлении запроса прерывания компьютер выполняет следующую последовательность действий:
1. определение наиболее приоритетного незамаскированного запроса на прерывание (если одновременно поступило несколько запросов)
2. определение типа выбранного запроса
3. сохранение текущего состояния счетчика команд и регистра флагов
4. определение адреса обработчика прерывания по типу прерывания и передача управления первой команде этого обработчика
5. выполнение программы – обработчика прерывания
6. восстановление сохраненных значений счетчика команд и регистра флагов прерванной программы
7. продолжение выполнения прерванной программы
Этапы 1-4 выполняются аппаратными средствами ЭВМ автоматически при появлении запроса прерывания. Этап 6 также выполняется аппаратно по команде возврата из обработчика прерывания.
Задача программиста – составить программу – обработчик прерывания, которая выполняла бы действия, связанные с появлением запроса данного типа, и поместить адрес начала этой программы в специальной таблице адресов прерывания. Программа-обработчик, как правило, должна начинаться с сохранения состояния тех регистров процессора, которые будут ею изменяться, и заканчиваться восстановлением состояния этих регистров. Программа-обработчик должна завершаться специальной командой, указывающей процессору на необходимость возврата в прерванную программу.
Время реакции – это время между появлением сигнала запроса прерывания и началом выполнения обработчика прерывания в том случае, если данное прерывание разрешено к обслуживанию.
Время реакции зависит от момента, когда процессор определяет факт наличия запроса прерывания. Опрос запросов прерываний может проводиться либо по окончании выполнения очередного этапа команды (например, считывание команды, считывание первого операнда и т.д.), либо после завершения каждой команды программы.
Первый подход обеспечивает более быструю реакцию, но при этом необходимо при переходе к обработчику прерывания сохранять большой объем информации о прерываемой программе, включающей состояние буферных регистров процессора, номера завершившегося этапа и т.д. При возврате из обработчика также необходимо выполнить большой объем работы по восстановлению состояния процессора. Во втором случае время реакции может быть достаточно большим. Однако при переходе к обработчику прерывания требуется запоминание минимального контекста прерываемой программы (обычно это счетчик команд и регистр флагов). В настоящее время в компьютерах чаще используется распознавание запроса прерывания после завершения очередной команды.
Глубина прерывания – максимальное число программ, которые могут прерывать друг друга. Глубина прерывания обычно совпадает с числом уровней приоритетов, распознаваемых системой прерываний.
Рис. 14.1. Выполнение прерывания в компьютере: tр — время реакции процессора на запрос прерывания; tс — время сохранения состояния прерываемой программы и вызова обработчика прерывания; tв — время восстановления прерванной программ
Механизм прерываний поддерживается аппаратными и программными средствами ОС. Различают векторный (vectored) и опрашиваемый (polled) типы прерываний. В обоих способах процессору передается информация об уровне приоритета.
При векторном типе прерываний в процессор передается также адрес обработчика прерывания. Для векторного типа схема обработки такова: электрический сигнал – запрос на подтверждение – вектор прерывания – обработчик.
Вектор прерывания – вектор начального состояния прерывающей программы. Вектор прерывания содержит всю необходимую информацию для перехода к прерывающей программе, в том числе ее начальный адрес. Каждому запросу (уровню) прерывания, каждому периферийному устройству соответствует свой вектор прерывания, способный инициировать выполнение соответствующей прерывающей программы. Векторы прерывания обычно находятся в специально выделенных фиксированных ячейках памяти.
Для опрашиваемого типа прерываний схема обработки такова: сигнал – запрос на подтверждение – уровень приоритета. Каждый уровень связан с несколькими устройствами. Вызываются все обработчики данного уровня. Один опознает свое устройство. Для упорядочивания работы обработчиков введен механизм приоритетных очередей, которые обслуживает модуль ОС – диспетчер прерываний
Приоритет прерывания (interrupt priority) – характеристика важности, присваиваемая программным прерываниям.
Аппарат приоритетов предназначен для повышения эффективности использования всех ресурсов ВС. Так, неэффективно одновременное выполнение двух заданий, каждое из которых требует большой загрузки устройств ввода-вывода и незначительно использует центральный процессор. Приоритет задания может назначаться исходя из:
— времени его выполнения («короткие» задания имеют более высокий приоритет по сравнению с «длинными» заданиями)
— объема используемой оперативной памяти (задания, требующие большого объема памяти, не должны иметь одинаковый приоритет)
— интенсивности и объема использования других ресурсов ВС
— срочности выполнения и т.д.
Понятие приоритета в прерывании программ имеет два смысла.
Предположим, что никаких ограничений на время поступления запросов прерывания не накладывается. При одновременном поступлении нескольких запросов для немедленного удовлетворения может быть принят только один. Этот тип приоритета, определяющий очередность рассмотрения запросов прерывания, называют приоритетом между запросами прерываний.
Прерывающие программы, однако, могут иметь относительно текущей программы различную степень важности, и не любым запросом может быть прервана выполняющаяся программа. Чтобы иметь возможность прервать текущую программу, принятый запрос должен соответствовать программе более важной, нежели выполняемая в данный момент. Этот тип приоритета определяет старшинство программ и его обычно называют приоритетом между прерывающими программами.
1. ПРИОРИТЕТ МЕЖДУ ЗАПРОСАМИ ПРЕРЫВАНИЙ
Различают абсолютный и относительный приоритеты:
Абсолютный приоритет – запрос, имеющий абсолютный приоритет, прерывает выполняемую программу и инициирует выполнение соответствующей прерывающей программы.
Относительный приоритет – запрос с относительным приоритетом является первым кандидатом на обслуживание после завершения выполнения текущей программы.
При программной распознавании причин прерывания прерывающая программа начинает анализ с тех запросов на прерывание, которые имеют более высокий приоритет. При этом в процессе работы мы можем программным путем изменить приоритет запросов. При аппаратном распознавании причин прерывания указанные функции возлагаются на специальное оборудование.
В случае простейшей аппаратной реализации приоритета между запросами прерываний может быть использован метод «последовательного поиска» (рис. 1). Суть метода состоит в последовательном изменении содержимого счетчика от 0 до 2 n -1 и просмотре всех 2 n уровней прерывания до совпадения содержимого счетчика с номером уровня.
При одновременном появлении нескольких запросов жестко закрепляется запрос с уровнем с меньшим номером. В этом случае приоритет жестко фиксированным. Изменить приоритетные соотношения можно лишь пересоединением линий сигналов запросов на входах системы прерывания. Метод «последовательного поиска» прост в реализации, но время реакции велико, т.к. в общем случае необходимо прохождение счетчиком всех 2 n позиций, что при большом n может выходить за допустимые временные пределы. Особенно это важно при работе в режиме реального времени.
Рис. 1. Реализация метода «последовательного поиска»
2. ЗАПРОС МЕЖДУ ПРЕРЫВАЮЩИМИ ПРОГРАММАМИ
В случае реализации приоритета между прерывающими программами определяется, какие из программ могут прервать данную программу, а какие нет. Этот вид приоритета для многоуровневых систем с достаточной глубиной прерывания имеет гораздо большее значение, чем приоритет между запросами прерывания. Таким образом, приоритет между запросами прерывания нужен лишь для выбора одного запроса из многих, а приоритет между прерывающимися программами определяет фактический порядок выполнения программ.
Так как степень важности программ, их объем, требуемые ресурсы и т.д. могут изменяться в ходе вычислительного процесса, то только приоритеты между запросами прерывания могут быть строго зафиксированы. Приоритеты же между прерывающими программами должны быть программно-управляемыми. В ЭВМ применяются два способа реализации программно-управляемого приоритета прерывающих программ, в которых используются соответственно порог прерывания (в малых и микроЭВМ) и маски прерывания (в ЭВМ общего назначения).
Порог прерывания – этот способ позволяет в ходе вычислительного процесса программным путем изменять уровень приоритета процессора (а следовательно, и обрабатываемой в данный момент на процессоре программы) относительно приоритетов запросов источника прерывания (в основном периферийных устройств), другими словами, задавать порог прерывания, т.е. минимальный уровень приоритета запросов, которым разрешается прерывать программу, идущую на процессоре.
Порог прерывания задается командой программы, устанавливающей в регистре порога прерывания код порога прерывания. Специальная схема выделяет наиболее приоритетный запрос прерывания, сравнивает его приоритет с порогом прерывания и, если он оказывается выше порога, вырабатывает общий сигнал прерывания, и начинается процедура прерывания.
Маска прерывания – шаблонная последовательность знаков, управляющая сохранением или исключением отдельных частей другой последовательности знаков. В простейшем виде маска – это двоичное число, каждый разряд которого соответствует одному из уровней прерывания и разрешает (например, состояние «1») или запрещает (состояние «0») прерывание от запросов, относящихся к данному уровню.
Маска загружается командой программы в регистр маски. Управление приоритетом находится полностью в распоряжении программы: программа, изменяя маску в регистре маски, может устанавливать произвольные приоритетные соотношения между программами без перекоммутации линий, по которым поступают запросы прерывания.
Для каждой прерывающей программы может быть установлена своя маска, указывающая, какие программы способны ее прерывать. Каждый разряд маски соответствует отдельной программе. Маски всех программ хранятся в памяти. Если какая-нибудь программа вызывается для выполнения, то ее маска засылается в регистр маски.
Физически маска реализуется обычно в виде триггерного регистра, состояние которого можно изменить программным путем. При формировании маски состояние «1» получают лишь те триггеры, которые соответствуют программам с более высоким, чем у данной программы, приоритетом.
Иногда создаются «групповые» маски, при которых каждый разряд воздействует на несколько уровней одновременно. Уровни прерываний, которые управляются одним разрядом маски прерывания, образуют «класс прерывания». Высшей степенью этой иерархии является главный триггер прерывания, выключающий (или включающий) всю СПП полностью.
В случае поступления запросов, запрещенных маской прерывания, СПП либо запоминает запрос, чтобы при снятии запрета удовлетворять его, либо игнорирует запрос, если его удовлетворение через время t может отрицательно повлиять на ход вычислительного процесса. Возможны и другие реакции СПП. В таком случае в маске на один уровень отводится более одного бита.
Источник: infopedia.su
Большая Энциклопедия Нефти и Газа
Если выполнение прерванной программы необходимо продолжить, старое PSW для этой программы вновь заносится в регистр PSW. Биты 40 — 63 старого PSW определяют адрес команды, начиная с которой должно продолжаться выполнение прерванной программы . [31]
Команда возврата из прерываний, RTI, как показано в приведенном выше фрагменте программы, применяется для выхода из программы обработки прерываний и вызывает возобновление выполнения прерванной программы. Это осуществляется восстановлением содержимого PSW и возвратом адреса из стека, а также восстановлением информации в соответствующих регистрах, после чего выполнение прерванной программы возобновляется, как будто оно и не прерывалось. [32]
ССП хранит всю необходимую информацию о состоянии системы в момент прерывания. Если в конце программы обработки прерывания имеется команда, заменяющая текущее ССП на старое, система восстановит состояние, предшествующее прерыванию, и выполнение прерванной программы будет продолжено. [33]
Запрос на прерывание может возникнуть как при работе Р1 или Р2 программ, так и во время работы РЗ программ. В первых двух случаях необходимо запомнить содержимое Р — счетчика для того, чтобы после обработки прерывания в состоянии процессора РЗ можно было продолжить выполнение прерванной программы . В третьем случае запрос на прерывание возник, когда программа уже выполняется в состоянии процессора РЗ. Поэтому имеются два входа в обработчики прерываний. На первый вход поступают все прерывания, возникшие при выполнении Р1 и Р2 программ, на второй — все прерывания, возникшие при выполнении РЗ программ. Управление от первого входа также передается на второй вход. [34]
Ввод-вывод по прерыванию происходит тогда, когда внешнему устройству разрешено останавливать выполнение центральным процессором текущих программ и передавать управление специальным служебным подпрограммам. Эти подпрограммы должны после вызова сохранить в памяти содержимое рабочих регистров, регистра состояния и счетчика команд, с тем чтобы при возврате управления основной программе не произошло никаких изменений и выполнение прерванной программы могло быть продолжено. [35]
Информация может передаваться синхронно и асинхронно. В случае возникновения критических ситуаций обеспечивается режим работы по прерыванию, предусматривающий временное прекращение работы БОИ или СП по данной программе, переключение на работу по прерывающей программе л в дальнейшем продолжение выполнения прерванной программы . [37]
Возникновение прерывания приводит к запоминанию состояния выполняемой в данный момент программы и к переходу к процедуре, указанной адресным словом, хранящимся в определенном для данного класса месте оперативной памяти. Одновременно запоминается содержимое указателей и регистров процессора. Возврат к выполнению прерванной программы происходит по специальной команде. [38]
Последней командой прерывающейч программы — командой Возврат из прерываний первое слово вектора состояния прерванной программы загружается из стека в счетчик команд, а затем второе слово — в регистр слова состояния процессора. Передача каждого слова сопровождается увеличением УС на два. После этого восстанавливается выполнение прерванной программы . [39]
Чтобы диспетчер смог выполнить свои управляющие функции, в аппаратуре ЭВМ есть возможность прерывать ( приостанавливать) выполнение программы и передавать управление диспетчеру. Это осуществляется при появлении какого-либо события. В подходящий момент выполнение прерванной программы продолжается так, как если бы в отношении программы никакого прерывания не было. [40]
Прерывание с кодом i F — деление с плавающей запятой — возникает, если предпринимается попытка деления на нуль. В качестве результата используется максимально допустимое число. После обработки прерывания выполнение прерванной программы продолжается. [41]
Число одновременно работающих с ЭВМ периферийных устройств можно увеличить благодаря экономии машинного, времени при операциях обмена, так как каждое прерывание и восстановление программ — требует выполнения ВчУ нескольких операций. Поэтому в ЭВМ вводится режим ириостанова, сущность которого сводится к тому, что по соответствующему сигналу останавливается выполнение текущей программы и У О получает непосредственный доступ к ОЗУ для осуществления необходимого числа операций записи и считывания. После этого ЭВМ продолжает выполнение прерванной программы . [42]
Также оператор ON представляет собой способ задания параллельных ветвей вычислений. В динамике счета исполняемая программа может быть прервана, если возникла ситуация, описанная списком параметров какого-либо оператора ON. После выполнения тела ON выполнение прерванной программы будет продолжено с той самой точки, на которой произошло прерывание. [43]
Контроллер прерываний обслуживает процедуры прерывания, принимает запрос на прерывание от внешних устройств, определяет уровень приоритета этого запроса и выдает сигнал прерывания процессору. Процессор, получив этот сигнал, приостанавливает выполнение текущей программы и переходит к выполнению специальной программы обслуживания того прерывания, которое запросило внеш — нее устройство. После завершения программы обслуживания восстанавливается выполнение прерванной программы . [44]
Источник: www.ngpedia.ru
Схема Бертрана обработки исключительных ситуаций
Схема обработки исключительных ситуаций, предложенная в языке C#, обладает одним существенным изъяном — ее можно применить некорректно. Она позволяет, в случае возникновения исключительной ситуации, уведомить о ее возникновении и спокойно продолжить работу, что в конечном счете приведет к неверным результатам.
Из двух зол — прервать вычисление с уведомлением о невозможности продолжения работы или закончить вычисления с ошибочным результатом вычисления — следует выбирать первое. Некорректно примененная схема C# приведет к ошибочным результатам. Приведу несколько примеров. Представьте, оформляется заказ на отдых где-нибудь на Канарах.
В ходе оформления возникает исключительная ситуация — нет свободных мест в гостинице — обработчик исключения посылает уведомление с принесением извинений, но оформление заказа продолжается. Вероятно, предпочтительнее отказаться от отдыха на Канарах и выбрать другое место, чем оказаться без крыши над головой, ночуя на берегу океана. Эта ситуация не является критически важной.
А что, если в процессе подготовки операции выясняется, что проведение ее в данном случае опасно? Никакие извинения не могут избавить от вреда, нанесенного операцией. Операция должна быть отменена.
Бертран Мейер в книге [1], в которой все механизмы, используемые в объектной технологии, тщательно обосновываются, предложил следующую схему обработки исключительных ситуаций. В основе ее лежит подход к проектированию программной системы на принципах Проектирования по Контракту. Модули программной системы, вызывающие друг друга, заключают между собой контракты.
Вызывающий модуль обязан обеспечить истинность предусловия, необходимого для корректной работы вызванного модуля. Вызванный модуль обязан гарантировать истинность постусловия по завершении своей работы. Если в вызванном модуле возникает исключительная ситуация, то это означает, что он не может выполнить свою часть контракта.
Что должен делать обработчик исключительной ситуации? У него только две возможности — Retry и Rescue. Первая (Retry) — попытаться внести некоторые коррективы и вернуть управление охраняемому модулю, который может предпринять очередную попытку выполнить свой контракт. Модуль может, например в следующей попытке запустить другой алгоритм, использовать другой файл, другие данные.
Если все закончится успешно и работа модуля будет соответствовать его постусловию, то появление исключительной ситуации можно рассматривать как временные трудности, успешно преодоленные. Если же ситуация возникает вновь и вновь, тогда обработчик события применяет вторую стратегию (Rescue), выбрасывая исключение и передавая управление вызывающему модулю, который и должен теперь попытаться исправить ситуацию. Важная тонкость в схеме, предложенной Бертраном, состоит в том, что исключение, выбрасываемое обработчиком, следует рассматривать не как панику, не как бегство, а как отход на заранее подготовленные позиции. Обработчик исключения должен позаботиться о восстановлении состояния, предшествующего вызову модуля, который привел к исключительной ситуации, и это гарантирует нахождение всей системы в корректном состоянии.
Схема Бертрана является схемой с возобновлением, и она наиболее точно описывает разумную стратегию обработки исключительных ситуаций. Не следует думать, что эта схема не может быть реализована на C#, просто она требует понимания сути и определенной структурной организации модуля. Приведу возможную реализацию такой схемы на C#:
Приведу краткие комментарии к этой процедуре, которую можно рассматривать как некоторый образец организации обработки исключительной ситуации:
- Конструкция try-catch блоков помещается в цикл do-while(!Success), завершаемый в случае успешной работы охраняемого блока, за чем следит булева переменная Success.
- В данном образце предполагается, что в теле охраняемого блока анализируется возможность возникновения исключительной ситуации и, в случае обнаружения опасности, выбрасывается собственное исключение, класс которого задан программно. В соответствии с этим тело try-блока содержит вызов метода MakeJob, выполняющего некоторую часть работы, после чего вызывается метод CheckDanger, выясняющий, не возникла ли опасность нарушения спецификации и может ли работа быть продолжена. Если все нормально, то выполняется метод MakeLastJob, выполняющий заключительную часть работы. Управление вычислением достигает конца try-блока, он успешно завершается и, поскольку остается истинной переменная Success, значение true которой установлено в начале try-блока, то цикл while, окаймляющий охраняемый блок и его обработчиков исключений, также успешно завершается.
- Если в методе CheckDanger выясняется, что нормальное продолжение вычислений невозможно, то выбрасывается исключение класса MyException. Оно перехватывается обработчиком исключения, стоящим за try-блоком, поскольку класс MyException указан как класс формального аргумента.
- Для простоты приведен только один catch-блок. В общем случае их может быть несколько, но все они строятся по единому образцу. Предполагается, что обработчик исключения может сделать несколько попыток исправить ситуацию, после чего повторно выполняется охраняемый блок. Если же число попыток, за которым следит переменная count, превосходит максимально допустимое, то обработчик выбрасывает новое исключение, задавая дополнительную информацию и передавая тем самым обработку ошибки на следующий уровень — вызываемой программе.
- Когда число попыток еще не исчерпано, обработчик исключения переменной Success дает значение false, гарантирующее повтор выполнения try-блока, увеличивает счетчик числа попыток и пытается исправить ситуацию.
- Как видите, эта схема реализует два корректных исхода обработки исключительной ситуации — Retry и Rescue — повтору с надеждой выполнить обязательства и передачи управления вызывающей программе, чтобы она предприняла попытки исправления ситуации, когда вызванная программа не смогла с этим справиться.
Доведем этот образец до реально работающего кода, где угроза исключения зависит от значения генерируемого случайного числа, а обработчик исключения может изменять границы интервала, повышая вероятность успеха.
Определим первым делом собственный класс исключений:
Минимум того, что нужно сделать, определяя свои исключения, — это задать три конструктора класса, вызывающие соответствующие конструкторы базового класса Exception.
В классе Excepts, методом которого является наш образец Pattern, определим следующие поля класса:
Random rnd = new Random(); int level = -10; bool Success; //true — нормальное завершение int count =1; // число попыток выполнения const int maxcount =3;
Определим теперь методы, вызываемые в теле охраняемого блока:
В классе Testing зададим метод, вызывающий метод Pattern:
Обратите внимание, что вызов метода Pattern находится внутри охраняемого блока. Поэтому, когда Pattern не справится с обработкой исключительной ситуации, ее обработку возьмет на себя универсальный обработчик, стоящий за try-блоком.
На рис. 23.6 показаны три варианта запуска метода TestPattern. В одном из них исключительной ситуации при вызове метода Pattern вообще не возникало, в другом — ситуация возникала, но коррекция обработчика исключения помогла и при повторе выполнения охраняемого блока в Pattern все прошло нормально. В третьем варианте метод Pattern не смог справиться с исключительной ситуацией, и она обрабатывалась в catch-блоке метода TestPattern.
Рис. 23.6. Обработка исключительных ситуаций. Три случая
23. Лекция: Отладка и обработка исключительных ситуаций
Класс Exception
Рассмотрим устройство базового класса Exception, чтобы понять, какую информацию может получить обработчик исключения, когда ему передается объект, задающий текущее исключение.
Основными свойствами класса являются:
- Message — строка, задающая причину возникновения исключения. Значение этого свойства устанавливается при вызове конструктора класса, когда создается объект, задающий исключение;
- HelpLink — ссылка (URL) на файл, содержащий подробную справку о возможной причине возникновения исключительной ситуации и способах ее устранения;
- InnerException — ссылка на внутреннее исключение. Когда обработчик выбрасывает новое исключение для передачи обработки на следующий уровень, то текущее исключение становится внутренним для вновь создаваемого исключения;
- Source — имя приложения, ставшего причиной исключения;
- StackTrace — цепочка вызовов — методы, хранящиеся в стеке вызовов в момент возникновения исключения;
- TargetSite — метод, выбросивший исключение.
Из методов класса отметим метод GetBaseException. При подъеме по цепочке вызовов он позволяет получить исходное исключение — первопричину возникновения последовательности выбрасываемых исключений.
Класс имеет четыре конструктора, из которых три уже упоминались. Один из них — конструктор без аргументов, второй — принимает строку, становящуюся свойством Message, третий — имеет еще один аргумент: исключение, передаваемое свойству InnerException.
В предыдущий пример я внес некоторые изменения. В частности, добавил еще один аргумент при вызове конструктора исключения в catch-блоке метода Pattern:
throw(new MyException(«Все попытки Pattern безуспешны», me));
В этом случае у создаваемого исключения заполняется свойство InnerExceptions. Для слежения за свойствами исключений я добавил метод печати всех свойств, вызываемый во всех обработчиках исключений:
static public void PrintProperties(Exception e)< Console.WriteLine(«Свойства исключения:»); Console.WriteLine(«TargetSite = «, e.TargetSite); Console.WriteLine(«Source = «, e.Source); Console.WriteLine(«Message = «,e.Message); if (e.InnerException == null) Console.WriteLine(«InnerException = null»); else Console.WriteLine(«InnerException = «, e.InnerException.Message); Console.WriteLine(«StackTrace = «, e.StackTrace); Console.WriteLine(«GetBaseException = «, e.GetBaseException());>
Из-за громоздкости не привожу результаты, но отмечу, что они соответствуют описанию, приведенному в тексте лекции.
В заключение темы исключений хочу еще раз подчеркнуть, что корректное применение механизма исключений должно поддерживаться целенаправленными усилиями программиста. Следует помнить о двух важных правилах:
- обработка исключений должна быть направлена не столько на уведомление о возникновении ошибки, сколько на корректировку возникшей ситуации;
- если исправить ситуацию не удается, то программа должна быть прервана так, чтобы не были получены некорректные результаты, не удовлетворяющие спецификациям программы.
Учебники к курсу
- Биллиг В.А.
Основы программирования на C#
Интернет-университет информационных технологий — ИНТУИТ.ру, 2006 - Фридман А.Л.
Язык программирования Си++
Интернет-университет информационных технологий — ИНТУИТ.ру, 2004 - Бертран Мейер
Объектно-ориентированное конструирование программных систем + CD
Интернет-университет информационных технологий — ИНТУИТ.ру, Русская
Источник: cyberpedia.su