Следующий листинг показывает, каким должен быть вложенный обработчик исключений внутри блока защиты ресурсов. Вы можете также вкладывать блоки защиты ресурсов в другие блоки защиты ресурсов или блоки обработки исключений.
Листинг 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. Специальный обработчик событий, используемый по умолчанию