我有一个使用最新版本的 EurekaLog 的 Delphi 10 项目。我目前正在使用 EurekaLog 来帮助我调试生产客户端中的问题。
我注意到 EurekaLog 没有记录线程内发生的错误。在我开始阅读它之后,我发现我需要从 更改TThread
为,并在我的覆盖方法TThreadEx
的开头添加以下代码。Execute
SetEurekaLogStateInThread(ThreadID, true);
尽管如此,当发生错误时,它不会在EL
文件中生成事件。
如果我添加ExceptionManager.StandardEurekaError('TThrdSincArquivos.Execute => ' + ex.Message);
,try..except
它会记录。但是堆栈跟踪显示为好像错误发生在我调用的行上StandardEurekaLog()
,而不是实际发生错误的行上。这违背了整个事情的目的。
另一个问题是它显示了一个我不想要的对话框,因为错误发生在后台线程中。我只想记录它。我应该只在主线程上有错误时得到一个对话框。
如何在线程中实现这些结果?
实际上用正确的堆栈记录错误。
在主线程上时,显示对话框,但在线程内,只记录没有对话框。
编辑
下面是我的 EurekaLog 多线程配置
这是我的线程声明:
unit ThrdSincArquivos;
interface
uses
System.Classes, System.SysUtils, System.Generics.Collections, REST.Client, REST.Types,
System.JSON, Data.DB, Datasnap.DBClient, FireDAC.Comp.Client, FireDAC.Stan.Param, System.SyncObjs, EBase, EExceptionManager, EClasses;
type
TThrdSincArquivos = class(TThreadEx)
private
我的线程的创建
constructor TThrdSincArquivos.Create(pPrimeiraExec: boolean; tipoSincParam: TTipoSinc);
begin
inherited Create(true);
NameThreadForDebugging('TThrdSincArquivos');
primeiraExec := pPrimeiraExec;
tipoSinc := tipoSincParam;
executadoThreadSinc := false;
FreeOnTerminate := true
end;
我的执行开始
procedure TThrdSincArquivos.Execute;
var
contador: Integer;
begin
inherited;
try
和 Execute 的结束
except
on ex: Exception do
begin
oLog.GravarLog(ex, 'TThrdSincArquivos.Execute => FIM');
end;
end;
end;
它拒绝将任何异常记录到 Elf 文件中。我试图在我自己的日志例程之后添加一个加薪,但它仍然没有帮助。它应该记录,但不是,除非我明确调用StandardEurekaError
,但我得到了错误的堆栈,我得到了对话框。