【问题标题】:How to pass call stack information to an exception using EurekaLog?如何使用 EurekaLog 将调用堆栈信息传递给异常?
【发布时间】:2013-07-05 08:11:15
【问题描述】:

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

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

【问题讨论】:

  • D2006 是否具有 Exception 类的 StackTraceStackInfo 属性?如果是这样,EurekaLog 将使用您需要的信息填充它们。
  • No D2006 不提供这些属性。他们是available since D2009
  • @DavidHeffernan:为什么要删除标签 eurekalog?问题和答案参考 EurekaLog?
  • 因为它不是一个标签的足够值得注意的主题。太窄了。该标签总共只有 8 个问题。但是有数百个与 EurekaLog 相关的问题。所以这是误导。你可能会点击标签并认为你有所有与 EurekaLog 相关的问题。
  • @DavidHeffernan:我的观点不同,我认为标签本身应该被删除,或者如果合适的话应该应用它。但我是新来的...... :)

标签: delphi exception-handling delphi-2006


【解决方案1】:

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

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

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

该记录有一个EurekaExceptionRecord.CallStack 列表。此专有列表可以使用CallStackToStrings 方法转换为TStrings,该方法也在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;

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

【讨论】:

  • 感谢您展示了一条路。我希望有一个更简单的解决方案,因为在我的多线程应用程序中处理这些回调并不容易。
【解决方案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;

【讨论】:

    【解决方案3】:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 2014-04-23
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      相关资源
      最近更新 更多