Главная » Delphi » Процесс обработки исключений

0

После  возникновения и передачи объекта исключения нормальный ход выполне ния программы прерывается и управление начинает передаваться от одного  обработ чика  исключений к другому до тех пор,  пока  исключение не будет обработано, а эк земпляр объекта исключения уничтожен. Этот  процесс построен на обработке стека вызовов и, следовательно, имеет  глобальный характер в пределах всей программы, а не только  в рамках  текущей  процедуры или модуля. В листинге 2.5 приведен пример, иллюстрирующий указанный принцип обработки исключений. Здесь  представлен главный модуль приложения Delphi, содержащего единственную форму  с одной кнопкой. Если щелкнуть  на кнопке, то метод  Button1Click() (обработки этого  со бытия) вызывает процедуру  Proc1(), которая, в свою очередь, вызывает процедуру Proc2(), вызывающую процедуру  Proc3(). Исключение передается именно в этой, последней, наиболее глубоко  вложенной процедуре Proc3(), что  позволяет просле дить весь процесс прохождения исключения через каждый  из блоков  try..finally до тех пор, пока оно не будет обработано внутри метода Button1Click().

CОВЕТ

Если запустить эту программу из интегрированной среды разработки Delphi, то про- следить процесс обработки исключения будет проще, если предварительно отключить встроенный обработчик исключений отладчика. Для этого следует сбросить флажок Stop on Delphi Exceptions во вкладке Language Exceptions диалогового окна Debugger Options. Доступ к этому диалоговому окну находится в меню Tools пункт Debugger Options.

Листинг 2.5. Демонстрация передачи и обработки исключений

unit Main; interface uses

SysUtils, Windows, Messages, Classes, Graphics, Controls,

Forms, Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Закрытые объявления }

public

{ Открытые объявления }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

type

EBadStuff = class(Exception);

procedure Proc3;

begin

try

raise EBadStuff.Create(‘Up the stack we go!’);

finally

ShowMessage(‘Exception raised. Proc3 sees the exception’);

end;

end;

procedure Proc2;

begin

try

Proc3;

finally

ShowMessage(‘Proc2 sees the exception’);

end;

end;

procedure Proc1;

begin

try

Proc2;

finally

ShowMessage(‘Proc1 sees the exception’);

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

const

ExceptMsg = ‘Exception handled in calling procedure. The message

is "%s"';

begin

ShowMessage(‘This method calls Proc1 which calls Proc2 which

calls Proc3′);

try

Proc1;

except

on E:EBadStuff do

ShowMessage(Format(ExceptMsg, [E.Message]));

end;

end;

end.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии