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

program Projectl;

uses Forms,

SysUtils, //добавлено вручную - там описан класс Exception Dialogs,

Unitl in 'Unitl.pas' {Forml};

{$R *.RES}

type

TExceptClass = class public

procédure GlobalExceptionHandler(Sender: TObject;
E: Exception) ;
end;
procedure TExceptClass.GlobalExceptionHandler(Sender: TObj ect;
E:Exception);

begin ShowMessage('Произошла исключительная ситуация ' + E.ClassName + ' : ' + E.Message

+ #13#10'Свяжитесь с разработчиками по тел. 222-33-44');

end; begin with TExceptClass.Create do

begin Application.OnException := GlobalExceptionHandler; Application.Initialize; Application.CreateForm(TForml, Forml); Application.Run; Free; end; end.

Здесь класс TExceptClass создается только для того, чтобы быть носителем метода GlobalException. Обработчик любого события - метод, и он должен относиться к какому-либо объекту. Поскольку он здесь нужен еще до инициализации форм приложения и других его составных частей, то и объект класса TExceptClass создается первым. Теперь пользователь знает, что благодарить за неожиданности нужно по указанному в сообщении об ошибке телефону разработчиков.

Есть и более простой способ присвоить обработчик событию Application.OnException. Для этого поместите на форму компонент типа TApplicationEvents (страница Additional Палитры компонентов), роль которого - предоставление "визуального" доступа к свойствам невизуального объекта TApplication. Среди его событий есть и On Exceptio п.

Но как "пощупать" переданный при исключительной ситуации объект? Обычная конструкция

on EExceptionType do...

указывает на класс объекта, но не на конкретный экземпляр. Если во время обработки требуется доступ к свойствам этого экземпляра, его нужно поименовать внутри on..do, указав перед именем класса некий идентификатор:

on EZD: EZeroDivide do EZD.Message := 'Деление на ноль!';

Здесь возникшее исключение выступает под именем EZD. МОЖНО изменить его свойства и отправить дальше:

var ÄPtr : Pointer;
Forml : TForm;

try

APtr := Forml;
with TObject (APtr) as TBitmap do;

except

on EZD: EInvalidCast do EZD.Message :=. EZD.Message + 'xa-xa!';

Raise;{ теперь обработка будет Сделана в другом месте }

end;

Но как поименовать исключительную ситуацию, не попавшую ни в одну из директив on..do? Или, может быть, в вашем обработчике вообще нет on. . do, а поработать с объектом надо? Описанный выше путь здесь не подходит. Для этих случаев есть пара системных функций Exceptobject и ExceptAddr. К сожалению, эти функции инициализируются только внутри конструкции try., except; в try. .finally работать с объектом- исключительной ситуацией не представляется возможным.

Протоколирование исключительных ситуаций

Часто нужно иметь подробный материал для анализа причин возникновения ИС. Разумно было бы записывать все данные о них в файл, чтобы потом прогнозировать ситуацию. Такой подход важен для программ, которые так или иначе будут отчуждены от разработчика: в случае возникновения непредвиденной ситуации это позволит ответить на вопросы "кто виноват?" и "что делать?". В следующем примере предложен вариант реализации протоколирования ИС.


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Июнь
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс