2013-07-05 72 views
2

我有一個線程應用程序中爲某種目的我想一個逮住異常調用堆棧信息傳遞給一個新的自定義異常:如何使用EurekaLog將調用堆棧信息傳遞給異常?

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

請問D2006具備的'StackTrace'和'StackInfo'屬性'異常類?如果願意的話,EurekaLog會爲您提供您需要的信息。 –

+0

沒有D2006不提供這些屬性。他們[從D2009開始](http://stackoverflow.com/questions/286628/hooking-a-stacktrace-in-delphi-2009)。 –

+0

@DavidHeffernan:你爲什麼刪除標籤eurekalog?問題和答案是指EurekaLog? –

回答

2

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; 

從這個出發點至少你應該能夠調查曝光功能,記錄等。所有的信息訪問。

+0

謝謝您展示了一種方法。我希望有一個更簡單的解決方案,因爲在我的多線程應用程序中處理這些回調不會很容易。 –

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; 
相關問題