Следующий листинг показывает, каким должен быть вложенный обработчик исключений внутри блока защиты ресурсов. Вы можете также вкладывать блоки защиты ресурсов в другие блоки защиты ресурсов или блоки обработки исключений.
Листинг 13.10, Вложенные блоки
01.procedure TForml.CreateFormClick(Sender: TObject); begin02.with TForm.Create(Self) do03.try04.try05.Caption := IntToStr(Top div Tag);06.except07.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.begin3.end;В рамках обработчика события OnException вы можете написать код. который будет обрабатывать исключения иным способом, нежели обработчик, используемый по умолчанию, или же оставить обработчик события пустым. Если вы не хотите, чтобы при возникновении исключения что-либо происходило, оставьте обработчик события пустым. В данном случае потребуется написать внутри блока обработчика события только какой-нибудь комментарий, чтобы редактор Code Editor не удалил код обработчика автоматически.
Обработчик события OnException может использоваться и более конструктивным образом. Например, вы можете написать код, который будет регистрировать все исключения и записывать их в текстовый файл для последующего просмотра.
В листинге 13.11 показано, как производится регистрация исключений внутри обработчика события OnException. На рис. 13.8 можно видеть результаты.
Листинг 13.11. Регистрация необработанных исключений
01.procedure TMainForm.AppEventsException(Sender: TObject; E: Exception);02. 03.var04.Log: TextFile;05.LogFilePath: string;06.begin07.LogFilePath := 'c:\exceptions.log';08.AssignFile(Log, LogFilePath);09.try10.if not FileExists(LogFilePath) then11.Rewrite(Log)12.else13.Append(Log); 14.WriteLn(Log, E.ClassType.ClassName,15.' exception occurred with message "', E.Message, '".');16.finally17.CloseFile(Log);18.end;19.end;Вы можете также модифицировать обработчик исключений, используемый по умолчанию, вручную (без применения компонентаTApplicationEvents). Для этого нужно создать метод, который будет принимать те же параметры, что и событие OnException. и назначить этот метод событию OnException в глобальном объекте Application.
Рис. 13.8. Зарегистрированные исключения

Листинг 13.12. Специальный обработчик события OnException
01.unit Unit1;02.interface03.uses04.Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,05.Dialogs, StdCtrls, XPMan;06.type07.TMainForm = class(TForm)08.Button1: TButton;09.XPManifest1: TXPManifest;10.procedure FormCreate(Sender: TObject);11.procedure Button1Click(Sender: TObject);12.private13.{ Private declarations }14.procedure MyHandler(Sender: TObject; E: Exception);15.public16.{ Public declarations }17.end;18.var19.MainForm: TMainForm;20.implementation21.{$R *.dfm}22.procedure TMainForm.MyHandler(Sender: TObject; E: Exception);23.begin24.MessageDlg('Do you like the "' + E.Message + '" exception?',25.mtConfirmation, mbYesNo, 0);26.end;27.procedure TMainForm.Button1Click(Sender: TObject);28.begin29.raise EReadError.Create('Read Error');30.end;31.procedure TMainForm.FormCreate(Sender: TObject);32.begin33.Application.OnException := MyHandler;34.end;35.end.После создании обработчика событий OnException вы должны будете назначить его событию OnException глобального объекта Application. То. что получено в результате, показано на рис. 13.9.
Листинг 13.13. Назначение обработчика событию OnException
1.procedure TMainForm.FormCreate(Sender: TObject); begin3.Application.OnException := MyHandler; end;Рис. 13.9. Специальный обработчик событий, используемый по умолчанию

