2011-10-11 57 views
1

我記錄了Elmah的異常,並想知道我使用的技術是否是好設計?用Elmah處理異常

現在我捕捉並重新拋出各種類和方法中發生的異常,並將它們記錄到程序的主try-catch塊中的Elmah。

//主程序

try 
{ 
    // Some code that fires off other classes, etc... 
    MyTestClass myTestClass = new MyTestClass(); 
    myTestClass.Execute(); 

} 
catch(Exception ex) 
{ 
    ErrorSignal.FromCurrentContext().Raise(ex); 
} 

// MyTestClass

public class MyTestClass 
    { 
     public object ApiResult { get; set; } 


     public string Execute() 
     {    
      try 
      { 
       // execute some code 
       // .... 
       // set xml message 
       ApiResult = "User information xml response"; 
      } 
      catch (Exception ex) 
      { 
       // set xml message 
       ApiResult = "something went wrong xml error response..."; 

       throw; 
      } 
     } 

    } 

它會更好登錄他們出現異常?另一個問題,我應該記錄我可以處理的錯誤而不捕捉異常嗎?例如,如果某些內容爲空,我應該對該內容進行測試(如果爲null ...)並在Elmah中記錄消息?

回答

9

與其使用Elmah的ErrorSignal類手動記錄錯誤,您應該努力讓ELMAH自動記錄錯誤,這會在應用程序的Error事件引發時發生。

在您的示例中,主程序存在嚴重問題。即,至少對最終用戶來說,吞嚥例外是。是的,例外情況正在使用ELMAH登錄,但您隱藏了用戶的錯誤。最終用戶會認爲她的表單提交(或其他)沒有錯誤,但實際上存在嚴重問題。

簡而言之,try...catch塊應該只能謹慎使用,例如在您可以從錯誤中恢復或者錯誤是「次要」的情況下,並且不應該停止工作流。但大多數錯誤都是真正的顯示塞子,並沒有優雅的解決方法。對於這個大多數情況,您希望讓錯誤滲透到ELMAH將自動記錄它的ASP.NET運行時以及用戶將看到錯誤頁面的位置,並提醒他們發生錯誤的事實。

看看我的這篇文章:Exception Handling Advice for ASP.NET Web Applications

+0

錯誤日誌記錄是針對需要吐出xml錯誤消息的web服務的,這就是爲什麼我不會在主循環中拋出異常的原因。 – chobo

+0

@chobo:我重申了你的問題,以更準確地反映你的問題。 –

+0

在這種情況下,在web方法中,我將錯誤響應字符串設置爲Exception.Message,使用Elmah記錄異常(我個人在Exception上使用擴展方法來執行此操作),併吞下異常。大體上你做什麼除了重新投擲。 –

2

我想下面的情況會給你一個什麼時候使用ErrorSignal.FromCurrentContext()。的意思。

var bo = new CustomerBO(); 
bo.Update(customer); 
try 
{ 
    Email.SendProfileChangedNotification(); 
} 
catch(Exception ex) 
{ 
    ErrorSignal.FromCurrentContext().Raise(ex); 
} 
Response.Redirect(Constants.ProfilePage); 

Email.SendProfileChangedNotification方法是不是在這個代碼,所以重要的是,我的意思是,我可以用它離開,如果有任何錯誤,我不希望向他們展示給用戶。重要的是他/她的個人資料被更新,並且用戶通過查看個人資料頁面來了解它。

所以我相信有代碼可能會不斷失敗的地方,我想通知他們,但我不想打破整個行動。