2012-01-04 63 views
4

我嘗試在我的應用程序的低層處理異常,因爲它們可以被處理(記錄它們)。但是,有些錯誤會導致應用程序崩潰,如果參數爲NULL,並且在這種情況下不應該拋出ArgumentNullException。如何避免在控制器中使用try ... catch?

如果考慮調出服務層的控制器層。我想避免服務層拋出異常,因爲我想在這裏處理所有這些(日誌記錄),但我倒在這種情況下是不可能的(如NULL情況)。

那麼避免在控制器中使用try ... catch的最佳方法是什麼?或者我應該真的使用try ... catch在控制器中?

回答

7

我更喜歡在Application_Error方法中處理所有未處理的異常(不應該發生的事情)。您可以在這裏記錄異常,並根據其性質顯示正確的錯誤視圖。

類似於自定義模型綁定器,驗證器,動作過濾器......也可能允許攔截一些特殊情況,以避免隨處使用try/catch來污染你的控制器。

對於我打算辦理企業一樣的錯誤,等一切......沒有什麼錯誤使用try/catch語句,甚至更好的使用if語句,並有服務層通知你一些操作是成功還是失敗(TryXXX模式)。

因此,一如既往,您的問題的答案是:它取決於。這取決於你的應用程序是如何組織的,你的服務層是如何組織的,可能發生什麼樣的錯誤,你希望明確處理的錯誤有多少,許多因素,當然還有許多,許多可能的解決方

3

要在達林季米特洛夫回答

比如像自定義模型粘合劑,驗證,操作篩選器,...也 可以允許攔截一些特殊的條件,以避免 用的try/catch污染你的控制器協作無處不在。

這是我更喜歡的。你可以做一個IExceptionFilter這將是這樣的:

public class ExceptionLoggingFilter : IExceptionFilter 
{ 
    private ILogger _logger; 

    public ExceptionLoggingFilter(ILogger logger) 
    { 
     _logger = logger; 
    } 

    public void OnException(ExceptionContext context) 
    { 
     Exception ex = context.Exception; 

     if (_logger != null) 
     { 
      _logger.log(ex) 
     } 
    } 
    context.ExceptionHandled = true; //see note 
} 

注意:如果你不想重新拋出你可以添加例外。如果您只想記錄日誌,但有另一個過濾器來處理它,則可以刪除該行。

然後在Global.aspx你會怎麼做:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new ExceptionLoggingFilter(new Log4NetLogger())); 
} 

我喜歡創建過濾器來創建一個Application_Error,因爲對我來說更容易不同的功能分開。 (如日誌記錄,檢查應用程序是否可以處理它等)