В процессе разработки приложений на Delphi 10 с использованием библиотеки EurekaLog для отладки и логирования ошибок в продакшене может возникнуть проблема с некорректным логированием ошибок, происходящих в фоновых потоках. В данной статье мы рассмотрим, как правильно настроить EurekaLog для логирования ошибок в потоках без отображения диалоговых окон, что особенно важно для фоновых задач.
Шаг 1: Использование TThreadEx вместо TThread
Для корректной работы EurekaLog в фоновых потоках необходимо использовать класс TThreadEx вместо TThread. Это позволяет EurekaLog автоматически обрабатывать ошибки в потоках.
type
TThrdSincArquivos = class(TThreadEx)
// Остальная часть класса
end;
Шаг 2: Настройка EurekaLog для фоновых потоков
Убедитесь, что в настройках EurekaLog включена поддержка многопоточности. Это можно сделать через компонент TEurekaLogEvents и настройку события OnExceptionAction.
procedure TForm1.FormCreate(Sender: TObject);
begin
with TEurekaLogEvents.Create(Self) do
try
OnExceptionAction := ExceptionAction;
// Настройка других параметров
finally
Free;
end;
end;
function TForm1.ExceptionAction(Const AEurekaAction: AEurekaActions): Boolean;
begin
if AEurekaAction = atShowingExceptionInfo then
Result := not AExceptionInfo.ThreadID = GetCurrentThreadID;
else
Result := True;
end;
Шаг 3: Обработка исключений в фоновых потоках
В методе Execute фонового потока необходимо обработать возможные исключения, используя стандартный блок try..except.
procedure TThrdSincArquivos.Execute;
begin
inherited;
try
// Основной код потока
except
on E: Exception do
begin
// Логирование ошибки
oLog.GravarLog(E, 'TThrdSincArquivos.Execute');
// Дополнительные действия, если необходимо
end;
end;
end;
Шаг 4: Автоматическая обработка ошибок в TThreadEx
Если используется класс TThreadEx, можно автоматически обрабатывать ошибки при завершении потока, установив свойство AutoHandleException в True.
type
TMyThread = class(TThreadEx)
protected
procedure Execute; override;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Thread: TMyThread;
begin
Thread := TMyThread.Create(True, 'My thread');
Thread.AutoHandleException := True;
Thread.FreeOnTerminate := True;
Thread.Start;
Thread := nil; // Не обращаться к переменной Thread после Start, если установлено FreeOnTerminate
end;
Заключение
При правильной настройке EurekaLog и использовании классов TThreadEx и TEurekaLogEvents можно добиться корректного логирования ошибок в фоновых потоках без отображения диалоговых окон. Это позволит эффективно отлаживать приложения и получать полную информацию об ошибках, возникающих в фоновых задачах.
Решение проблемы логирования ошибок в фоновых потоках с использованием EurekaLog и Delphi 10, включая настройку компонентов и обработку исключений.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.