如何使用EurekaLog将调用堆栈信息传递给异常?

时间:2013-07-05 08:11:15

标签: delphi exception-handling delphi-2006

我有一个线程化的应用程序,出于某种目的,我想将catched异常的调用堆栈信息传递给新的自定义异常:

try
    //here an unknown exception is rissen
except 
    on E: Exception do
    begin
        if ... then
          raise EMyException.Create(E, CallStackOfExceptionEAsString);
    end;
end;

最好的方法是什么,最好使用EurekaLog?我正在使用Delphi 2006 btw。

3 个答案:

答案 0 :(得分:2)

EurekaLog公开了几个事件处理程序,如OnExceptionNotify

您可以在代码中实现这些功能。例如:procedure EurekaLogExceptionNotify( EurekaExceptionRecord: TEurekaExceptionRecord; var Handled: Boolean);

您可以在此处看到TEurekaExceptionRecord中定义的ExceptionLog.pas。但是你可能只拥有非源版本,它的工作正常。

该记录包含EurekaExceptionRecord.CallStack列表。可以使用TStrings单位中定义的CallStackToStrings方法将此专有列表转换为ExceptionLog

以下是我将CallStack写入StringList的示例。

CallStackList := TStringList.Create;
try
  CallStackToStrings(EurekaExceptionRecord.CallStack, CallStackList);

  LogMessage := 'An unhandled exception occured. Here is the CallStack.' + #13#10
    + CallStackList.Text;
finally
  CallStackList.Free;
end;

至少从这个起点开始,你应该能够调查暴露的功能,记录等。所有信息都可以访问。

答案 1 :(得分:2)

EurekaLog提供了一个函数GetLastExceptionCallStack()(在单位ExceptionLog.pas中定义)。 使用这个我编写了以下函数(基于示例代码here):

function GetLastEurekalogCallStackAsString(): string;
{$IFDEF EUREKALOG}
var
  Stack: TEurekaStackList;
  Str: TStringList;
{$ENDIF}
begin
{$IFDEF EUREKALOG}
    Stack := GetLastExceptionCallStack();
    try
        Str := TStringList.Create;
        try
            CallStackToStrings(Stack, Str);
            Result := Str.Text;
        finally
            FreeAndNil(Str);
        end;
    finally
        FreeAndNil(Stack);
    end;
{$ELSE}
    Result := '';
{$ENDIF}
end;

所以你可以写:

try
    //here an unknown exception is rissen
except 
    on E: Exception do
    begin
        if ... then
          raise EMyException.Create(E, GetLastEurekalogCallStackAsString());
    end;
end;

答案 2 :(得分:0)

EurekaLog 7具有Chained Exception support,它是专门为此任务设计的。只需在选项中启用它(默认情况下已启用)并使用:

try
  // here an unknown exception is rissen
except 
  on E: Exception do
  begin
    if ... then
      Exception.RaiseOuterException(EMyException.Create(E.Message));
      // for old IDEs:
      // raise EMyException.Create(E.Message);
  end;
end;