Обработка исключительных ситуаций (exceptions) EDBEngineError

       
Информация об ошибке BDE может быть получена для использования в приложении
из EDBEngineError. Исключительная ситуация EDBEngineError обрабатывается в
программе с помощью конструкции try ... except. Когда возникает исключительная
ситуация BDE, то может быть создан объект EDBEngineError и различные поля этого 
объекта могут быть использованы для программного определения, что не в порядке 
и что требуется для исправления ситуации. Далее, для данной исключительной 
ситуации может быть сгенерировано несколько сообщений об ошибках. Это требует 
организации перебора сообщений об ошибках для получения нужной информации.
 
Поля, наиболее важные для данного контекста :
 
   ErrorCount: Integer; показывает количество ошибок в св-ве Errors; 
     счет начинается с нуля.
 
   Errors: TDBError; набор записей, которые содержат информацию о каждой
     полученной ошибке; доступ к записям происходит по индексу типа Integer.
 
   Errors.ErrorCode: DBIResult; показывает номер ошибки BDE для текущей
     записи об ошибках в св-ве Errors.
 
   Errors.Category: Byte; категория ошибки, относящаяся к полю ErrorCode.
 
   Errors.SubCode: Byte; подкод (subcode) для значения в ErrorCode.
 
   Errors.NativeError: LongInt; код удаленной ошибки, возвращаемый сервером;
     если ноль, то это ошибка не сервера; возвращаемое SQL запросом значение
     появляется в данном поле.
 
   Errors.Message: TMessageStr; сообщение об ошибке, сервера или BDE.
 
В конструкции try..except объект создается напрямую в разделе except.
После создания можно работать поля обычным образом или передавать объект
в другую роцедуру для исследования ошибки. Кроме того, можно создать свой
собственный компонент для использования в данных целях; его набор 
функциональных возможностей можно легко переносить между приложениями.
В примере ниже во время возникновения исключительной ситуации BDE создается
объект DBEngineError, передается в процедуру и анализируется для выделения
информации об ошибке.
 
В конструкции try..except, объект DBEngineError можно создать с помощью
синтаксиса, приведенного ниже:
 
  procedure TForm1.Button1Click(Sender: TObject);
  var
    i: Integer;
  begin
    if Edit1.Text > ' ' then begin
      Table1.FieldByName('Number').AsInteger := StrToInt(Edit1.Text);
      try
        Table1.Post;
      except on E: EDBEngineError do
        ShowError(E);
      end;
    end;
  end;
 
В этой процедуре делается попытка изменить значение поля в таблице и затем
вызывается метод Post соответствующей таблицы. В конструкцию try..except
заключается только попытка Post. Если при этом возникает ошибка BDE, то
выполняеся секция except, в которой создается объект E типа EDBEngineError и 
затем E передается в процедуру ShowError. Заметьте, что только EDBEngineError
учитывается в данной конструкции. В реальной ситуации нужно, скорее всего,
проверять и другие виды исключительных ситуаций.
 
Процедура ShowError принимает объект EDBEngineError, передаваемый в качестве
параметра и исследует содержащиеся сообщения об ошибках. В данном примере
информация об ошибках показывается в компоненте TMemo. Первый шаг состоит в 
определении количества действительно возникших ошибок. Для этого служит
св-во ErrorCount. После того, как стало известно количество ошибок, можно
использовать цикл для доступа к каждой записи об ошибке в свойстве Error
и помещению информацию о них в TMemo. 
 
  procedure TForm1.ShowError(AExc: EDBEngineError);
  var
    i: Integer;
  begin
    Memo1.Lines.Clear;
    Memo1.Lines.Add('Number of errors: ' + IntToStr(AExc.ErrorCount));
    Memo1.Lines.Add('');
    {Iterate through the Errors records}
    for i := 0 to AExc.ErrorCount - 1 do begin
      Memo1.Lines.Add('Message: ' + AExc.Errors[i].Message);
      Memo1.Lines.Add('   Category: ' + 
        IntToStr(AExc.Errors[i].Category));
      Memo1.Lines.Add('   Error Code: ' + 
        IntToStr(AExc.Errors[i].ErrorCode));
      Memo1.Lines.Add('   SubCode: ' + 
        IntToStr(AExc.Errors[i].SubCode));
      Memo1.Lines.Add('   Native Error: ' + 
        IntToStr(AExc.Errors[i].NativeError));
      Memo1.Lines.Add('');
    end;
  end;

Используются технологии uCoz