3

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

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 顺便说一句。

4

3 回答 3

2

EurekaLog 提供了一个函数GetLastExceptionCallStack()(在 unit 中定义ExceptionLog.pas)。使用它我编写了以下函数(基于此处的示例代码):

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;
于 2013-07-05T14:11:59.793 回答
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;

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

于 2013-07-05T10:37:36.320 回答
0

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

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;
于 2019-06-11T12:41:19.857 回答