Исключительные ситуации

Автор работы: Пользователь скрыл имя, 29 Февраля 2012 в 10:52, реферат

Описание

Обработка исключительных ситуаций - механизм языков программирования, предназначенный для описания реакции программы на ошибки времени выполнения и другие возможные проблемы (исключения), которые могут возникнуть при выполнении программы и приводят к невозможности (бессмысленности) дальнейшей отработки программой её базового алгоритма. В русском языке также применяется более короткая форма термина: «обработка исключений».

Содержание

Долговременность керамических изделий, наличие распространённого сырья для их изготовления, высокие санитарно-технические и художественно-декоративные качества, огнестойкость, водонепроницаемость, кислотостойкость определяют их широкое распространение во всех развитых странах.

Работа состоит из  1 файл

Реферат мсключительные ситуации.docx

— 31.82 Кб (Скачать документ)

 

 

Оглавление

 

Введение 2

Структурная обработка исключительных ситуаций 4

Модель исключительных ситуаций в Delphi 6

Синтаксис обработки исключительных ситуаций 7

Заключение 17

Список используемой литературы 18

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Введение

 

Обработка исключительных ситуаций - механизм языков программирования, предназначенный для описания реакции программы на ошибки времени выполнения и другие возможные проблемы (исключения), которые могут возникнуть при выполнении программы и приводят к невозможности (бессмысленности) дальнейшей отработки программой её базового алгоритма. В русском языке также применяется более короткая форма термина: «обработка исключений».

 

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

 

  • Нулевое значение знаменателя при  выполнении операции целочисленного деления. Результата у операции быть не может, поэтому ни дальнейшие вычисления, ни попытка использования результата деления не приведут к решению  задачи.
  • Ошибка при попытке считать данные с внешнего устройства. Если данные не удаётся ввести, любые дальнейшие запланированные операции с ними бессмысленны.
  • Исчерпание доступной памяти. Если в какой-то момент система оказывается не в состоянии выделить достаточный для прикладной программы объём оперативной памяти, программа не сможет работать нормально.
  • Появление сигнала аварийного отключения электропитания системы. Прикладную задачу, по всей видимости, решить не удастся, в лучшем случае (при наличии какого-то резерва питания) прикладная программа может позаботиться о сохранении данных.
  • Появление на входе коммуникационного канала данных, требующих немедленного считывания. Чем бы ни занималась в этот момент программа, она должна перейти к чтению данных, чтобы не потерять поступившую информацию.

 

 

 

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

(exception) в Delphi введены новые расширения языка Pascal. В данной работе мы

дадим  описание тому, что из себя представляет такая обработка, почему она

полезна, приведем соответствующий синтаксис Object Pascal и примеры

использования исключительных ситуаций в Delphi.

 

Структурная обработка исключительных ситуаций

  Структурная обработка исключительных  ситуаций - это система, 

позволяющая программисту при возникновении  ошибки (исключительной

ситуации) связаться с кодом программы, подготовленным для обработки такой 

ошибки. Это выполняется с помощью  языковых конструкций, которые как  бы

"охраняют" фрагмент кода программы и  определяют обработчики ошибок,

которые будут вызываться, если что-то пойдет не так в "охраняемом" участке 

кода. В данном случае понятие исключительной ситуации относится к языку и 

не  нужно его путать с системными исключительными ситуациями (hardware

exceptions), такими как General Protection Fault. Эти исключительные ситуации

обычно  используют прерывания и особые состояния "железа" для обработки 

критичной системной ошибки; исключительные ситуации в Delphi же

независимы  от "железа", не используют прерываний и используются для 

обработки ошибочных состояний, с которыми подпрограмма не готова иметь 

дело. Системные исключительные ситуации, конечно, могут быть перехвачены 

и преобразованы в языковые исключительные ситуации, но это только одно из

применений  языковых исключительных ситуаций.

  При традиционной обработке ошибок, ошибки, обнаруженные в 

процедуре обычно передаются наружу (в вызывавшую процедуру) в виде

возвращаемого значения функции, параметров или глобальных переменных

(флажков). Каждая вызывающая процедура  должна проверять результат вызова 

на  наличие ошибки и выполнять соответствующие  действия. Часто, это просто

выход еще выше, в более верхнюю вызывающую процедуру и т.д. : функция A

вызывает  B, B вызывает C, C обнаруживает ошибку и возвращает код ошибки в

B, B проверяет возвращаемый код, видит, что возникла ошибка и возвращает

код ошибки в A, A проверяет возвращаемый код и выдает сообщение об ошибке

либо  решает сделать что-нибудь еще, раз  первая попытка не удалась.

  Такая "пожарная бригада"  для обработки ошибок трудоемка,  требует 

написания большого количества кода в котором  можно легко ошибиться и 

который трудно отлаживать.

Одна  ошибка в коде программы или переприсвоение в цепочке 

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

ошибочное состояние с положением дел во внешнем мире. Результатом будет 

ненормальное  поведение программы, потеря данных или ресурсов, или крах

системы.

  Структурная обработка исключительной  ситуации замещает ручную 

обработку ошибок автоматической, сгенерированной  компилятором системой

уведомления. В приведенном выше примере, процедура  A установила бы

"охрану" со связанным обработчиком ошибки  на фрагмент кода, в котором 

вызывается  B. B просто вызывает C. Когда C обнаруживает ошибку, то создает

(raise) исключительную ситуацию. Специальный код, сгенерированный

компилятором  и встроенный в Run-Time Library (RTL) начинает поиск

обработчика данной исключительной ситуации. При  поиске "защищенного"

участка кода используется информация, сохраненная  в стеке. В процедурах C и

B нет такого участка, а в A - есть. Если один из обработчиков ошибок, которые

используются  в A, подходит по типу для возникшей в C исключительной

ситуации, то программа переходит на его  выполнение. При этом, область стека,

используемая  в B и C, очищается; выполнение этих процедур прекращается.

  Если в A нет подходящего обработчика, то поиск продолжается в более

верхнем уровне, и так может идти, пока поиск не достигнет подходящего 

обработчика ошибок среди используемых по умолчанию  обработчиков в RTL.

Обработчики ошибок из RTL только показывают сообщение об ошибке и

форсированно  прекращают выполнение программы. Любая  исключительная

ситуация, которая осталась необработанной, приведет к прекращению 

выполнения  приложения.

  Без проверки возвращаемого кода  после каждого вызова подпрограммы,

код программы должен быть более простым, а скомпилированный код - более 

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

содержать дополнительный код для проверки возвращаемого результата и 

передачи  его в A. B ничего не должна делать для передачи исключительной

ситуации, возникшей в C, в процедуру A - встроенная система обработки

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

  Данная система называется структурной,  поскольку обработка ошибок 

определяется  областью "защищенного" кода; такие  области могут быть

вложенными. Выполнение программы не может перейти  на произвольный

участок кода; выполнение программы может  перейти только на обработчик

исключительной  ситуации активной программы.

 

Модель  исключительных ситуаций в Delphi

  Модель исключительных ситуаций  в Object Pascal является

невозобновляемой(non-resumable). При возникновении исключительной

ситуации  Вы уже не сможете вернуться в  точку, где она возникла, для 

продолжения выполнения программы (это позволяет  сделать 

возобновляемая(resumable) модель). Невозобновляемые исключительные

ситуации  разрушают стек, поскольку они  сканируют его в поисках обработчика;

в возобновляемой модели необходимо сохранять  стек, состояние регистров процессора в точке возникновения ошибки и выполнять поиск обработчика и

его выполнение в отдельном стеке. Возобновляемую систему обработки 

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

невозобновляемую.

 

 

 

 

 

 

 

 

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

  Теперь, когда мы рассмотрели,  что такое исключительные ситуации,

давайте дадим ясную картину, как они  применяются. Новое ключевое слово,

добавленное в язык Object Pascal - try. Оно используется для обозначения 

первой  части защищенного участка кода. Существует два типа защищенных

участков:

 

? try..except

? try..finally

 

 

Первый  тип используется для обработки  исключительных ситуаций. Его

синтаксис:

 

 

try

Statement 1;

Statement 2;

...

except

on Exception1 do Statement;

on Exception2 do Statement;

...

else

Statements; {default exception-handler}

end;

 

  Для уверенности в том, что  ресурсы, занятые вашим приложением, 

освободятся в любом случае, Вы можете использовать конструкцию второго 

типа. Код, расположенный в части finally, выполняется в любом случае, даже

если  возникает исключительная ситуация. Соответствующий синтаксис:

 

try

Statement1;

Statement2;

...

finally

Statements; { These statements always execute }

end;

 

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

  Ниже приведены процедуры A,B и  C, обсуждавшиеся ранее, 

воплощенные в новом синтаксисе Object Pascal:

 

 

type

ESampleError = class(Exception);

 

var

ErrorCondition: Boolean;

 

procedure C;

begin

writeln(`Enter C`);

if (ErrorCondition) then

begin

writeln(`Raising exception in C`);

raise ESampleError.Create(`Error!`);

end;

writeln(`Exit C`);

end;

 

procedure B;

begin

writeln(`enter B`);

C;

writeln(`exit B`);

end;

 

procedure A;

begin

writeln(`Enter A`);

try

writeln(`Enter A``s try block`);

B;

writeln(`After B call`);

except

on ESampleError do

writeln(`Inside A``s ESampleError handler`);

on ESomethingElse do

writeln(`Inside A``s ESomethingElse handler`);

end;

writeln(`Exit A`);

end;

 

begin

writeln(`begin main`);

ErrorCondition := True;

A;

writeln(`end main`);

end.

 

При ErrorCondition = True программа выдаст:

 

begin main

Enter A

Enter A`s try block

enter B

Enter C

Raising exception in C

Inside A`s ESampleError handler

Exit A

end main

 

  Возможно вас удивила декларация  типа `ESampleError =class` вместо 

`=object`; это еще одно новое расширение  языка. Delphi вводит новую модель 

объектов, доступную через декларацию типа `=class`. Описание новой объектной 

модели  дается в других уроках. Здесь же достаточно сказать, что 

исключительные  ситуации (exceptions) являются классами, частью новой 

объектной модели.

  Процедура C проверяет наличие  ошибки (в нашем случае это  значение 

глобальной  переменной) и, если она есть (а это  так), C вызывает(raise)

исключительную  ситуацию класса ESampleError.

  Процедура A помещает часть кода  в блок try..except. Первая часть этого 

блока содержит часть кода, аналогично конструкции begin..end. Эта часть кода

завершается ключевым словом except, далее следует  один или более 

обработчиков  исключительных ситуаций on xxxx do yyyy, далее  может быть

включен необязательный блок else, вся конструкция  заканчивается end;. В 

конструкции, назначающей определенную обработку  для конкретной

исключительной  ситуации (on xxxx do yyyy), после резервного слова on

указывается класс исключительной ситуации, а  после do следует собственно код 

обработки данной ошибки. Если возникшая исключительная ситуация подходит

по  типу к указанному после on, то выполнение программы переходит сюда (на

код после do). Исключительная ситуация подходит в том случае, если она того

же  класса, что указан в on, либо является его потомком. Например, в случае on

EFileNotFound обрабатываться будет ситуация, когда файл не найден. А в 

случае on EFileIO - все ошибки при работе с  файлами, в том числе и 

предыдущая  ситуация. В блоке else обрабатываются все ошибки, не

обработанные  до этого.

  Приведенные в примере процедуры  содержат код (строка с writeln),

который отображает путь выполнения программы. Когда C вызывает exception,

программа сразу переходит на обработчик ошибок в процедуре A, игнорируя 

оставшуюся  часть кода в процедурах B и C.

  После того, как найден подходящий  обработчик ошибки, поиск 

оканчивается. После выполнения кода обработчика, программа продолжает

выполняться с оператора, стоящего после слова end блока try..except (в примере 

- writeln(`Exit A`)).

  Конструкция try..except подходит, если  известно, какой тип ошибок нужно 

обрабатывать  в конкретной ситуации. Но что делать, если требуется выполнить 

некоторые действия в любом случае, произошла  ошибка или нет? Это тот 

случай, когда понадобится конструкция try..finally.

 

  Рассмотрим модифицированную процедуру  B:

 

procedure NewB;

var

P: Pointer;

begin

writeln(`enter B`);

GetMem(P, 1000);

C;

FreeMem(P, 1000);

  writeln(`exit B`);

end;

 

Если C вызывает исключительную ситуацию, то программа уже не

возвращается  в процедуру B. А что же с теми 1000 байтами памяти,

захваченными  в B? Строка FreeMem(P,1000) не выполнится и  Вы потеряете 

кусок памяти. Как это исправить? Нужно  ненавязчиво включить процедуру B в 

процесс, например:

 

procedure NewB;

var

P: Pointer;

Информация о работе Исключительные ситуации