Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Локальная обработка




Чтобы сделать возможным использование локальных (специализированных) обработчиков исключений, в состав языка введены две конструкции: try …finally и try … except. Обе конструкции имеют похожий синтаксис, но разное назначение. Блоки у включают в себя инструкции программы

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

Конструкция try …finally состоит из двух блоков (try и finally) и имеет следующую форму:

try

// Инструкции, выполнение которых может вызвать ошибку

finally

// Инструкции, которые должны быть выполнены даже в случае ошибки

end;

Конструкция try …finally работает так: если в любой из инструкций блока try возникает исключение, то управление передается первой инструкции блока finally. Если же исключение не возникло, то последовательно выполняются все инструкции обоих блоков.

ПРИМЕР:

procedure TForm1.Button2Click(Sender: TObject);

var MyPic: TBitmap;

begin

try

//Создание объекта типа «растровое изображение»

Mypic:=TBitmap.Create;

//загрузка изображения из файла в объект MyPic

MyPic.LoadFromFile('IMG_0420.bmp');

//вывод изображения на поверхность формы

form1.Canvas.Draw(10,20,MyPic);

finally

//даже в случае выполнения двух предыдущих операций уничтожить объект MyPic

MyPic.Free;

end;

end;

Так как конструкция try …finally не ликвидирует исключительную ситуацию, в приведенной процедуре при возникновении исключения глобальный обработчик выдаст сообщение о характере ошибки.

Конструкция try … except также состоит из двух блоков (try и except) и имеет следующую форму:

 

Try

{Инструкции, выполнение которых может вызвать ошибку}

Except

{Инструкции, которые должны быть выполнены в случае ошибки}

End;

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

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

ПРИМЕР:

procedure TForm1.Button2Click(Sender: TObject);

begin

try

if OpenDialog1.Execute then

begin

image1.Picture.LoadFromFile(OpenDialog1.FileName);

image1.Stretch:=true;

end;

except

MessageDlg('Ошибка открытия файла ' + OpenDialog1.FileName + '!', mtError, [mbOK], 0);

end;

end;

Блок except можно разбить на несколько частей с помощью конструкций on…do, позволяющих анализировать класс исключения для его более удобной и полной обработки. Конструкция on…do применяется в случаях, когда действия по обработке исключения зависят от класса исключения, и имеет следующую форму:

On {идентификатор: класс исключения} do

{инструкции обработки исключения этого класса};

Else {инструкции}

В инструкции on класс возникшего исключения сравнивается с указанным классом исключения. В случае совпадения классов выполняются инструкции после слова do, реализующие обработку этого исключения.

Идентификатор (произвольное имя, заданное программистом) является необязательным элементом и может отсутствовать, при этом не ставится и разделительный знак двоеточия (:). Идентификатор — это локальная переменная, представляющая собой экземпляр класса исключения, который можно использовать для доступа к объекту возникшего исключения. Эта переменная доступна только внутри “своей” конструкции on…do.

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

Если в блоке except расположено несколько конструкций on…do, то else располагается в конце блока и относится ко всей совокупности конструкций on…do. Следующая после слова else инструкция выполняется в том случае, если обработка исключения не была осуществлена ни одной из инструкций, расположенных в любой из конструкций do блока. Инструкции, следующие после слов do и else, могут быть составными.

ПРИМЕР:

procedure TForm1.Button2Click(Sender: TObject);

var x,y,res:real;

begin

try

x:= StrToInt(Edit1.Text);

y:= StrToInt(Edit2.Text);

res:= x/y;

Edit3.Text:=FloatToStr(res);

except

on EZeroDivide do begin

MessageDlg('Попытка деления на ноль!', mtError, [mbOK], 0);

edit2.SetFocus;

edit3.Text:='Ошибка!';

end;

on eo: EConvertError do begin

MessageDlg(‘Ошибка преобразования!'+#10#13+EO.message, mtError, [mbOK], 0);

edit2.SetFocus;

edit3.Text:='Ошибка!';

end;

else begin

MessageDlg('Ошибка не идентифицирована!', mtWarning, [mbOK], 0);

edit2.SetFocus;

edit3.Text:='Ошибка!';

end;

end;

end;

 

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

try

{Инструкции}

try

{Инструкции}

finally

{Инструкции}

end;

except

{Инструкции}

end;

 

или

 

try

{Инструкции}

try

{Инструкции}

except

{Инструкции}

end;

finally

{Инструкции}

end;

 

Если какие-либо действия должны быть выполнены независимо от того, произошла ошибка или нет, то удобно использовать конструкцию try…finally. Однако, как отмечалось, эта конструкция не обрабатывает исключение, а лишь в некоторой степени смягчает его последствия. Если же требуется произвести и локальную обработку исключения, то можно включить конструкцию try…finally в конструкцию try…except. При возникновении исключения это позволяет выполнить обязательные инструкции блока finally и обработать исключение инструкциями блока ехсерt. Например:

 

procedure TForml.Button1Click(Sender: TObject);

var MyPic: TBitmap;

Begin

try

// Инструкции, которые могут вызвать ошибку

try

MyPic:= TBitmap.Create;

MyPic.LoadFromFile (‘photo.bmp’);

Form1.Canvas.Draw (10, 20, MyPic);

// Обязательное освобождение памяти

finally

MyPic Free;

end; {try... finally)

// Анализ и обработка ошибки

except

on EFOpenError do

MessageDlg (’Ошибка открытия файла photo.bmp!’, mtError, [mbOK], 0);

on EInOutError do

MessageD1g (’Ошибка чтения файла photo.bmp!’, mtError, [mbOK], 0);

on EInvalidGraphicOperation do

MessageDlg (’Ошибка графики!’, mtError, [mbOK], 0);

on EInvalidGraphic do

MessageDlg(’Неправильный графический формат файла!’, mtError, [mbOK], 0)

else Application.HandleException(Sender);

end; {try... except)

end;

 

При нажатии кнопки Button1 в форме отображается изображение из файла photo.bmp. Конструкция try…finally вложена в конструкцию trу…ехсерt, в которой выполняются анализ и обработка возможного исключения. В блоке ехсерt проверяется, к какому классу относится возникшее исключение ошибка открытия файла, ошибка чтения файла, ошибка выполнения графической операции или неправильный формат графического Обработка возникающих исключений заключается в выдаче пользователю сообщения о характере ошибки. Если исключение не соответствует ни одному из проверяемых классов, то вызывается глобальный обработчик с помощью инструкции Application.HandleException (Sender), расположенный после else.

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...