Вложенные блоки обработки исключений Delphi

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

Листинг 13.10, Вложенные блоки

 

01.procedure TForml.CreateFormClick(Sender: TObject); begin
02.with TForm.Create(Self) do
03.try
04.try
05.Caption := IntToStr(Top div Tag);
06.except
07.on EDivByZero do Caption := 'Tag = 0';
08.end;
09.ShowModal;
10.finally Free;
11.end;
12.end;

 


Глобальный объект Application отвечает за обработку исключений, не обрабатываемых блоком обработки исключений, который может находиться где-то в приложении. Чтобы изменить обработчик исключений, используемый по умолчанию, мы можем использовать компонент TApplicationEvents. относящийся к категории Additional (Дополнительные).
Компонент TApplicationEvents предлагает событие OnException. которое генерируется всякий раз, когда возникает необработанное исключение.
Событие OnException может быть обработано с помощью процедуры типа TExceptionEvent. Процедура, обрабатывающая событие OnException. принимает два параметра: объект Sender и объект Exception.
1.procedure TMainForm.AppEventsException(Sender: TObject; E: Exception);
2.begin
3.end;
В рамках обработчика события OnException вы можете написать код. который будет обрабатывать исключения иным способом, нежели обработчик, используемый по умолчанию, или же оставить обработчик события пустым. Если вы не хотите, чтобы при возникновении исключения что-либо происходило, оставьте обработчик события пустым. В данном случае потребуется написать внутри блока обработчика события только какой-нибудь комментарий, чтобы редактор Code Editor не удалил код обработчика автоматически.
Обработчик события OnException может использоваться и более конструктивным образом. Например, вы можете написать код, который будет регистрировать все исключения и записывать их в текстовый файл для последующего просмотра.
В листинге 13.11 показано, как производится регистрация исключений внутри обработчика события OnException. На рис. 13.8 можно видеть результаты.
Листинг 13.11. Регистрация необработанных исключений
01.procedure TMainForm.AppEventsException(Sender: TObject; E: Exception);
02. 
03.var
04.Log: TextFile;
05.LogFilePath: string;
06.begin
07.LogFilePath := 'c:\exceptions.log';
08.AssignFile(Log, LogFilePath);
09.try
10.if not FileExists(LogFilePath) then
11.Rewrite(Log)
12.else
13.Append(Log);   
14.WriteLn(Log, E.ClassType.ClassName,
15.' exception occurred with message "', E.Message, '".');
16.finally
17.CloseFile(Log);
18.end;
19.end;
Вы можете также модифицировать обработчик исключений, используемый по умолчанию, вручную (без применения компонентаTApplicationEvents). Для этого нужно создать метод, который будет принимать те же параметры, что и событие OnException. и назначить этот метод событию OnException в глобальном объекте Application.
Рис. 13.8. Зарегистрированные исключения 

Листинг 13.12. Специальный обработчик события OnException

 

01.unit Unit1;
02.interface
03.uses
04.Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
05.Dialogs, StdCtrls, XPMan;
06.type
07.TMainForm = class(TForm)
08.Button1: TButton;
09.XPManifest1: TXPManifest;
10.procedure FormCreate(Sender: TObject);
11.procedure Button1Click(Sender: TObject);
12.private
13.{ Private declarations }
14.procedure MyHandler(Sender: TObject; E: Exception);
15.public
16.{ Public declarations }
17.end;
18.var
19.MainForm: TMainForm;
20.implementation
21.{$R *.dfm}
22.procedure TMainForm.MyHandler(Sender: TObject; E: Exception);
23.begin
24.MessageDlg('Do you like the "' + E.Message + '" exception?',
25.mtConfirmation, mbYesNo, 0);
26.end;
27.procedure TMainForm.Button1Click(Sender: TObject);
28.begin
29.raise EReadError.Create('Read Error');
30.end;
31.procedure TMainForm.FormCreate(Sender: TObject);
32.begin
33.Application.OnException := MyHandler;
34.end;
35.end.
После создании обработчика событий OnException вы должны будете назначить его событию OnException глобального объекта Application. То. что получено в результате, показано на рис. 13.9.
Листинг 13.13. Назначение обработчика событию OnException
1.procedure TMainForm.FormCreate(Sender: TObject); begin
3.Application.OnException := MyHandler; end;
Рис. 13.9. Специальный обработчик событий, используемый по умолчанию 

dle

Помоги проекту! Расскажи друзьям об этом сайте: