const Lrjg№rre : string = ' с: \аррехс. leg' ;
procedure LogException;
var fs: TFileStream;
m : word;buf : arrayfO..511] of char;
begin
if FileExists (LogName) then m := :fjXLyperiReadSAfcite else m := frrCreate;
fs := TFileStream.Create(LogName,m);
f s. Seek (0, soFrorriEnd) ;
StrPCopy(Buf,DateTimeToStr(Now) +'. ');

ExceptionErrorMessage

{ExceptObject,ExceptAddr,@buf[StrLen(buf)],SizeOf(Buf)-StrLen(buf));
StrCat(Buf,#13#10);
fs.WriteBuffer(Buf, StrLen(buf));
fs.Free;
end;

procedure TForml.ButtonlClick(Sender: TObject) ; varx,y, z: real; begin try try

x:=1.0;y:=0.0;

z := x/y; except LogException; raise; end; except

on Е:ЕШг_Ёггог do ShowMessage (' IntError') ;
on E:FJYatJnError do ShowMessage ('MathError') ;
end;
end;

Здесь задачу записи информации об ИС решает процедура LogException. Она открывает файловый поток и пишет туда информацию, отформатированную при ШУОДЗ уже упоминавшейся функции ExceptionErrorMessage. В качестве ее параметров выступают значения функций Exceptobject и ExceptAddr. К сформированной строке добавляется время возникновения ИС. Для каждого защищаемого блока кода создаются две вложенные конструкции try. .except. Первая, внутренняя - для вас; в ней ИС протоколируется и продвигается дальше. Внешняя - для пользователя; именно в ней проводится анализ типа ИС и готовится сообщение.

В Object Pascal существует и расширенный вариант употребления оператора raise:

raise окземпляр объекта типа Exception> [at <адрес>]

Естественно, объектный тип должен быть порожден от Exception. То, что в таком типе ничего не переопределено, не столь важно - главное, что в обработчике ИС можно отследить именно этот тип.

ELoginError = class(Exception);
If LoginAttemptsNo >
MaxAttempts then raise ELoginError.Create('Ошибка регистрации пользователя') ;

Конструкция at <адрес> используется для того, чтобы изменить адрес, к которому привязывается возникшая ИС, в пределах одного блока обработки ИС.

Коды ошибок в исключительных ситуациях

Если ваше приложение уже готовится к продаже, если вы планируете его техническую поддержку, то пора задуматься о присвоении числовых кодов ошибкам, возникающим в нем. Сообщение типа "Exception EZeroDivide in module MyNiceProgram at addr $0781BAB0" КДЮ ДГИ разработчика, пользователя же оно повергнет в полный ступор. Если он позвонит в вашу службу техподдержки, то, скорее всего, не сможет ничего объяснить. Гораздо грамотнее дать ему уже "разжеванную" информацию и, в том числе, числовой код.

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

"Классический" способ поместить текст в файл ресурсов - 3-этапный:

1. Создается исходный файл ресурсов с расширением гс, в который помещаются необходимые строки с нужными номерами.

2. Файл обрабатывается компилятором ресурсов brcc32.exe (находится в папке bin в структуре папок Delphi). На выходе образуется одноименный файл с расширением res.


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

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



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

  • Декабрь
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс