首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用EurekaLog将调用堆栈信息传递给异常?

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

Stack Overflow用户
提问于 2013-07-05 16:11:15
回答 3查看 1.2K关注 0票数 3

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

代码语言:javascript
复制
try
    //here an unknown exception is rissen
except 
    on E: Exception do
    begin
        if ... then
          raise EMyException.Create(E, CallStackOfExceptionEAsString);
    end;
end;

最好的方法是什么,最好是使用EurekaLog?我使用的是Delphi2006btw。

EN

回答 3

Stack Overflow用户

发布于 2013-07-05 18:37:36

EurekaLog公开了几个像OnExceptionNotify这样的事件处理程序。

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

在这里您可以看到一个在ExceptionLog.pas中定义的TEurekaExceptionRecord。但你可能只是拥有非源码版本,它工作得很好。

该记录有一个EurekaExceptionRecord.CallStack列表。这个专有列表可以使用CallStackToStrings方法转换为TStrings,该方法也在ExceptionLog单元中定义。

下面是一个将CallStack写入StringList的示例。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-07-05 22:12:00

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

代码语言:javascript
复制
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;

所以你可以这样写:

代码语言:javascript
复制
try
    //here an unknown exception is rissen
except 
    on E: Exception do
    begin
        if ... then
          raise EMyException.Create(E, GetLastEurekalogCallStackAsString());
    end;
end;
票数 2
EN

Stack Overflow用户

发布于 2019-06-11 20:41:20

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

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17484107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档