我有一个线程化的应用程序,出于某种目的,我想将捕获的异常的调用堆栈信息传递给新的自定义异常:
try
//here an unknown exception is rissen
except
on E: Exception do
begin
if ... then
raise EMyException.Create(E, CallStackOfExceptionEAsString);
end;
end;最好的方法是什么,最好是使用EurekaLog?我使用的是Delphi2006btw。
发布于 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的示例。
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-05 22:12:00
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;发布于 2019-06-11 20:41:20
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;https://stackoverflow.com/questions/17484107
复制相似问题