Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как обрабатывать ошибки в COM-объектах

Delphi , Технологии , COM и DCOM

Как обрабатывать ошибки в COM-объектах

Объявление: "Сдается рекламное место на сообщениях об ошибках. Microsoft".


TCustomBasePlugObject = class(TAutoObject, IUnknown, IDispatch)
...
protected
function SafeCallException(ExceptObject: TObject; ExceptAddr:
  Pointer): {$IFDEF _D4_}HResult{$ELSE}Integer{$ENDIF}; override;
...

function TCustomBasePlugObject.SafeCallException;
var
  ExMsg: string;
begin
  Result := inherited SafeCallException(ExceptObject, ExceptAddr);
  try
    if ExceptObject is EAbort then
      exit;
    ExMsg := 'Exception: PlugObject="' if ExceptObject is Exception then
    begin
      ExMsg := ExMsg + #13' Message: '#13' ' +
        Exception(ExceptObject).Message +
        #13' Module:' + GetModuleFileName +
        #13' Adress:' + Format('%p', [ExceptAddr]);
      if (ExceptObject is EOleSysError) and
        (EOleSysError(ExceptObject).ErrorCode < 0) then
        ExMsg := ExMsg + #13'
          OleSysError.ErrorCode =
            '+IntToStr(EOleSysError(ExceptObject).ErrorCode);
    end;
    toLog(ExMsg);
  except
  end;
end;

Проблема обработки ошибок в объектах COM - это давняя и сложная задача!

В этом коде определена класс TCustomBasePlugObject, который наследуется от TAutoObject, IUnknown и IDispatch. Класс переопределяет метод SafeCallException, чтобы обработать исключения, которые возникают при вызове методов объекта.

Метод SafeCallException принимает два параметра: ExceptObject (ссылка на объект TObject) и ExceptAddr (указатель на память). Он сначала вызывает метод SafeCallException, который отвечает за передачу исключения вверх по стеку вызовов, а затем пытается записать информацию о исключении.

Вот что происходит в коде:

  1. Если исключение является объектом EAbort, метод немедленно выходит без записи какой-либо информации.
  2. Он проверяет, является ли ExceptObject экземпляром класса Exception. Если это так, он строит строку сообщения, содержащую:
    • Имя плагинного объекта
    • Сообщение исключения
    • Модуль, который бросил исключение (полученный с помощью GetModuleFileName)
    • Адрес, на котором возникло исключение (форматированный как hexadecimal pointer value)
  3. Если исключение является экземпляром класса EOleSysError, он проверяет, является ли код ошибки отрицательным. Если это так, он добавляет код ошибки к сообщению.
  4. Наконец, он вызывает метод toLog (предположительно функцию записи) с построенным сообщением.

Блок except на конце пустой, что означает, что любые исключения, возникшие при выполнении этого кода, будут передаваться вверх по стеку вызовов и потенциально пойманы другими обработчиками исключений.

В целом, этот код предоставляет основной механизм для записи информации о исключениях, которые возникают при вызове методов объекта COM. Это хорошая практика обрабатывать ошибки и исключения в надежном виде, чтобы обеспечить стабильность и информативность вашего приложения в случае неожиданных событий.

В качестве альтернативного решения можно рассмотреть использование болееadvanced logging framework или централизованной системы обработки ошибок, которая может предоставлять более подробную информацию о исключении,such as stack trace or additional contextual data. Кроме того, вы можете хотеть реализовать более конкретные механизмы обработки исключений в зависимости от типа исключения и его степени важности.

В статье описывается способ обработки ошибок в COM-объектах, используя пример класса TCustomBasePlugObject с overridden методом SafeCallException для записи ошибок в лог.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: COM и DCOM ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 11:31:24/0.0054171085357666/1