Объявление: "Сдается рекламное место на сообщениях об ошибках. Microsoft".
TCustomBasePlugObject = class(TAutoObject, IUnknown, IDispatch)
...
protectedfunction SafeCallException(ExceptObject: TObject; ExceptAddr:
Pointer): {$IFDEF _D4_}HResult{$ELSE}Integer{$ENDIF}; override;
...
function TCustomBasePlugObject.SafeCallException;
var
ExMsg: string;
begin
Result := inherited SafeCallException(ExceptObject, ExceptAddr);
tryif ExceptObject is EAbort then
exit;
ExMsg := 'Exception: PlugObject="' if ExceptObject is Exception thenbegin
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);
exceptend;
end;
Проблема обработки ошибок в объектах COM - это давняя и сложная задача!
В этом коде определена класс TCustomBasePlugObject, который наследуется от TAutoObject, IUnknown и IDispatch. Класс переопределяет метод SafeCallException, чтобы обработать исключения, которые возникают при вызове методов объекта.
Метод SafeCallException принимает два параметра: ExceptObject (ссылка на объект TObject) и ExceptAddr (указатель на память). Он сначала вызывает метод SafeCallException, который отвечает за передачу исключения вверх по стеку вызовов, а затем пытается записать информацию о исключении.
Вот что происходит в коде:
Если исключение является объектом EAbort, метод немедленно выходит без записи какой-либо информации.
Он проверяет, является ли ExceptObject экземпляром класса Exception. Если это так, он строит строку сообщения, содержащую:
Имя плагинного объекта
Сообщение исключения
Модуль, который бросил исключение (полученный с помощью GetModuleFileName)
Адрес, на котором возникло исключение (форматированный как hexadecimal pointer value)
Если исключение является экземпляром класса EOleSysError, он проверяет, является ли код ошибки отрицательным. Если это так, он добавляет код ошибки к сообщению.
Наконец, он вызывает метод 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.