2011-01-12 59 views
1

我這些天書面方式的API一些數據操縱和我都面臨着一個問題,我不能回答自己:d自定義異常類,以提醒的錯誤和日誌

我已經擴展了.NET的異常類應用程序異常類,因爲我想添加一些功能,每當API拋出異常時執行。 例如,我想通過短信和電子郵件提醒錯誤消息和堆棧跟蹤,我想通過Log4net記錄內部異常。我不知道這是否是使用自定義異常類的好方法,或者是否濫用了自定義異常的含義。

我已閱讀this article有關如何擴展在C# 所以這裏的異常,我們用我的代碼示例去:

public class CustomExceptionClass : Exception 
{ 
    /// <summary> 
    /// I use custom functionality here everytime this exception occures 
    /// </summary> 
    /// <param name="errorMessage">error message</param> 
    /// <param name="innerEx">Inner exception that cause this exception</param> 
    public MyCustomException(string errorMessage, Exception innerEx) : base(errorMessage, innerEx) 
    { 
     //log exception 
     _log.ErrorFormat(errorMessage, innerEx); 
     //alert via sms and email 
     AlertMailer.SendAlertMessage(errorMessage, innerEx, innerEx.Message); 
    } 
} 
+1

其他人都表示它已經,但無論如何:只是構建一個異常對象,但這並不意味着它永遠不會被拋出,更何況在它的代碼構造(近似)的位置。另外請注意,此時的exeception對象的StackTrace是非常無用的,因爲它將是「空的」(此時沒有拋出異常)。 – 2011-01-12 12:41:32

回答

4

我認爲通過拋出自定義異常來做日誌記錄和警報是一種有效的技術。

但是,您不應該在異常構造函數中執行日誌記錄和警報。相反,您應該捕獲API中所有入口點的自定義異常,並在catch塊中執行日誌記錄和警報。例如:

void MyApiFunction() 
{ 
    try 
    { 
     // do data manipulation 
    } 
    catch(MyCustomException ex) 
    { 
     _log.ErrorFormat(ex.ErrorMessage, ex.InnerEx); 
     AlertMailer.SendAlertMessage(ex.ErrorMessage, ex.InnerEx); 
    } 
} 
1

自定義異常應該用來定義不同類型的異常。從數據庫

  • 例外,從文件
  • 例外IO
  • 例外,從web服務

他們應該很簡單,並且不包含其他邏輯比分配變量。爲什麼?因爲如果異常構造函數拋出另一個異常,您將難以追蹤它。

處理的方式對這些例外情況是:

  1. AOP(Spring.NET)
  2. 具體嘗試/捕獲
  3. 全局異常處理程序

在程序

namespace ConsoleApplication1 { 
    class Program { 
     static void Main(string[] args) { 
      try { 
       //do something 
      } catch(Exception e) { 
       //log error 
      } 
     } 
    } 
} 

或Web站點

public class ApplicationErrorModule : IHttpModule { 

    public void Init(HttpApplication context) { 
     context.Error += new EventHandler(context_Error); 
    } 

    private void context_Error(object sender, EventArgs e) { 
     //log error 
    } 
} 
0

重理療,如日誌記錄和發送郵件不會在異常的構造函數的歸屬。您應該使用AOP作爲@petro建議,或者在catch語句中處理異常。