【发布时间】:2017-10-06 23:01:55
【问题描述】:
我有一个使用最新版本的 EurekaLog 的 Delphi 10 项目。我目前正在使用 EurekaLog 来帮助我调试生产客户端中的问题。
我注意到 EurekaLog 没有记录线程内发生的错误。在我开始阅读之后,我发现我需要从TThread 更改为TThreadEx,并在我的Execute 覆盖方法的开头添加以下代码。
SetEurekaLogStateInThread(ThreadID, true);
尽管如此,当发生错误时,它不会在EL 文件中生成事件。
如果我在try..except 上添加ExceptionManager.StandardEurekaError('TThrdSincArquivos.Execute => ' + ex.Message);,它会记录。但是堆栈跟踪显示为好像错误发生在我调用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
和执行结束
except
on ex: Exception do
begin
oLog.GravarLog(ex, 'TThrdSincArquivos.Execute => FIM');
end;
end;
end;
它拒绝将任何异常记录到 Elf 文件中。我试图在我自己的日志例程之后添加一个加薪,但它仍然没有帮助。它应该记录,但它不是,除非我明确调用StandardEurekaError,但我得到了错误的堆栈,我得到了对话框。
【问题讨论】:
-
顺便说一句,没有XE10这样的东西
-
这对 EurekaLog 来说非常令人失望。我个人使用 MadExcept 并强烈推荐它。
-
@Pascal 你可以使用TEurekaLogEvents component。该组件提供 [OnExceptionAction]() 事件,允许在 Eureka 处理异常时跳过不必要的步骤。该事件有 AEurekaAction 参数来定义执行的步骤。参数值 atShowingExceptionInfo 向我们表明 Eureka 想要显示错误对话框。如果不想显示对话框,只需将 AExecute 参数设置为 False。
-
@Pascal 还有 AExceptionInfo 参数 - 它是具有几个有用属性的类。您可以检查 ThreadID、ThreadException 和 SynchronizeException 以了解后台线程中是否确实出现了异常。
标签: multithreading delphi eurekalog