2014-10-01 36 views
3

我有一個自定義異常,在那裏我已經重寫了Data財產使用反射像下面...如何使用額外的Data屬性將自定義異常記錄到Elmah?

public class MyCustomException : Exception 
{ 
    private readonly SomeModel _log; 
    public MyCustomException(SomeModel log) 
     : base(string.Format("Could not insert to some table")) 
    { 
     _log = log; 
    } 

    public override System.Collections.IDictionary Data 
    { 
     get 
     { 
      var data = new Dictionary<string, object>(); 
      foreach (PropertyInfo pinfo in _log.GetType().GetProperties()) 
      { 
       data.Add(pinfo.Name, pinfo.GetType().GetProperty(pinfo.Name)); 
      } 
      return data; 
     } 
    } 
} 

當上述異常被拋出時,它會記錄到ELMAH但不記錄了Data

我需要做些什麼改變才能使Data也記錄到elmah?請指教。

回答

1

Elmah.Error對象的Detail屬性 - 然後由ErrorLog類處理 - 從異常的ToString()方法構建。

// Elmah.Error 
public Error(Exception e, HttpContext context) 
{ 
    // snip 
    this._detail = e.ToString(); // here 
    // snip 

您的數據添加到在MyCustomException ToString方法看到它在ELMAH的覆蓋。

+0

如果你想爲這個數據定製一個過程,你必須創建一個自定義的'ErrorLog'類 – samy 2014-10-07 14:34:35

1

@samy可能更正確的,但我也發現,我的情況中的另一種可能的選擇。我在一個webapi2項目中使用elmah,在這個項目中用戶是匿名的,在一個特定的控制器中,我想從視圖模型中記錄一些請求的上下文(在我的情況下,是一個電子郵件地址,但我可能會記錄更多的數據),而且我想成爲能夠將錯誤與電子郵件相關聯,以便在發生錯誤後,如果同一用戶能夠成功提交訂單,我可以確定。

在我的控制器中,我在一個事務中執行了一些數據庫調用,然後在一個try/catch塊中提交一個命令給paypal。在catch中,我使用包含電子郵件的消息創建一個新的異常實例,並將innerException屬性設置爲拋出的異常並拋出新的異常。

我知道有可能丟失一些堆棧跟蹤信息,我在我的上下文中測試了這一點,並且似乎維護了堆棧跟蹤,但控制器內部發生異常,因爲此特定控制器和應用程序沒有多少層。如果任何人有類似的情況,這種方法可能是最快最容易的。

catch (Exception ex) 
{ 
    Exception newException = new Exception(viewModel.ContactEmail, ex); 
    throw newException; 
} 

這裏假設你有一個異常過濾器,如以下(爲的WebAPI),並且過濾器被註冊爲在Global.asax的全球性的。

public class LogExceptionAttribute : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext actionExecutedContext) 
    { 
     if (HttpContext.Current != null) 
     { 
      ErrorSignal.FromCurrentContext().Raise(actionExecutedContext.Exception); 
     } 
    } 
} 
相關問題