Автор работы: Пользователь скрыл имя, 29 Февраля 2012 в 10:52, реферат
Обработка исключительных ситуаций - механизм языков программирования, предназначенный для описания реакции программы на ошибки времени выполнения и другие возможные проблемы (исключения), которые могут возникнуть при выполнении программы и приводят к невозможности (бессмысленности) дальнейшей отработки программой её базового алгоритма. В русском языке также применяется более короткая форма термина: «обработка исключений».
Долговременность керамических изделий, наличие распространённого сырья для их изготовления, высокие санитарно-технические и художественно-декоративные качества, огнестойкость, водонепроницаемость, кислотостойкость определяют их широкое распространение во всех развитых странах.
begin
writeln(`enter NewB`);
GetMem(P, 1000);
try
writeln(`enter NewB``s try block`);
C;
writeln(`end of NewB``s try block`);
finally
writeln(`inside NewB``s finally block`);
FreeMem(P, 1000);
end;
writeln(`exit NewB`);
end;
Если в A поместить вызов NewB вместо B, то программа выведет сообщения
следующим образом:
begin main
Enter A
Enter A`s try block
enter NewB
enter NewB`s try block
Enter C
Raising exception in C
inside NewB`s finally block
Inside A`s ESampleError handler
Exit A
end main
Код в блоке finally выполнится при любой ошибке, возникшей в
соответствующем блоке try. Он же выполнится и в том случае, если ошибки не возникло. В любом случае память будет освобождена. Если возникла ошибка,
то сначала выполняется блок finally, затем начинается поиск подходящего
обработчика. В штатной ситуации, после блока finally программа переходит на
следующее предложение после блока.
Почему вызов GetMem не помещен внутрь блока try? Этот вызов может
окончиться неудачно и вызвать exception EOutOfMemory. Если это произошло,
то FreeMem попытается освободить память, которая не была распределена.
Когда мы размещаем GetMem вне защищаемого участка, то предполагаем, что B
сможет получить нужное количество памяти, а если нет, то более верхняя
процедура получит уведомление EOutOfMemory.
А что, если требуется в B распределить 4 области памяти по схеме все-
или-ничего? Если первые две попытки удались, а третья провалилась, то как
освободить захваченную область память? Можно так:
procedure NewB;
var
p,q,r,s: Pointer;
begin
writeln(`enter B`);
P := nil;
Q := nil;
R := nil;
S := nil;
try
writeln(`enter B``s try block`);
GetMem(P, 1000);
GetMem(Q, 1000);
GetMem(R, 1000);
GetMem(S, 1000);
C;
writeln(`end of B``s try block`);
finally
writeln(`inside B``s finally block`);
if P <> nil then FreeMem(P, 1000);
if Q <> nil then FreeMem(Q, 1000);
if R <> nil then FreeMem(R, 1000);
if S <> nil then FreeMem(S, 1000);
end;
writeln(`exit B`);
end;
Установив сперва указатели в NIL, далее можно определить, успешно ли
прошел вызов GetMem.
Оба типа конструкции try можно использовать в любом месте,
допускается вложенность любой глубины. Исключительную ситуацию можно
вызывать внутри обработчика ошибки, конструкцию try можно использовать
внутри обработчика исключительной ситуации.
Вызов исключительной ситуации
В процедуре C из примера мы уже могли видеть, как должна поступать
программа
при обнаружении состояния
исключительную ситуацию:
raise ESampleError.Create(`Error!`);
После ключевого слова raise следует код, аналогичный тому, что
используется для создания нового экземпляра класса. Действительно, в момент
вызова исключительной ситуации создается экземпляр указанного класса;
данный экземпляр существует до момента окончания обработки
исключительной ситуации и затем автоматически уничтожается. Вся
информация, которую нужно сообщить в обработчик ошибки передается в
объект через его конструктор в момент создания.
Почти все существующие классы исключительных ситуаций являются
наследниками базового класса Exception и не содержат новых свойств или
методов. Класс Exception имеет несколько конструкторов, какой из них
конкретно использовать - зависит от задачи. Описание класса Exception можно
найти в on-line Help.
Доступ к экземпляру объекта exception
До сих пор мы рассматривали механизмы защиты кода и ресурсов, логику
работы программы в исключительной ситуации. Теперь нужно немного
разобраться с тем, как же обрабатывать возникшую ошибку. А точнее, как
получить дополнительную информацию о коде ошибки, текст сообщения и т.п.
Как уже говорилось, при вызове исключительной ситуации (raise)
автоматически
создается экземпляр
содержит информацию об ошибке. Весь вопрос в том, как в обработчике данной
ситуации получить доступ к этому объекту.
Рассмотрим модифицированную процедуру A в нашем примере:
procedure NewA;
begin
writeln(`Enter A`);
try
writeln(`Enter A``s try block`);
B;
writeln(`After B call`);
except
on E: ESampleError do writeln(E.Message);
on ESomethingElse do
writeln(`Inside A``s ESomethingElse handler`);
end;
writeln(`Exit A`);
end;
Здесь все изменения внесены в строку
on ESE: ESampleError do writeln(ESE.Message);
Пример демонстрирует еще одно новшество в языке Object Pascal - создание
локальной переменной. В нашем примере локальной переменной является ESE -
это тот самый экземпляр класса ESampleError, который был создан в процедуре
C в момент вызова исключительного состояния. Переменная ESE доступна
только внутри блока do. Свойство Message объекта ESE содержит сообщение,
которое было передано в конструктор Create в процедуре C.
Есть еще один способ доступа к экземпляру exception - использовать
функцию ExceptionObject:
on ESampleError do
writeln(ESampleError(
Заключение
В данной работе мы рассмотрели, как можно использовать систему
обработки исключительных ситуаций в программе. Нами выяснено, что пренебрегать обработкой исключительных ситуаций не стоит, так как благодаря такой обработке при разработке программы, можно получить значительно лучший результат, затратив меньше времени.
Список литературы