我有一个线程化的应用程序,出于某种目的,我想将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。
答案 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;