2012-12-03 28 views
6

在MVC中管理業務中的異常或錯誤的最佳方法是什麼?我找到了幾種解決方案,但不知道選擇哪種解決方案。在MVC中管理業務中的異常或錯誤的最佳方法是什麼?

溶液1

public Person GetPersonById(string id) 
{ 
    MyProject.Model.Person person = null; 
    try 
    { 
     person = _personDataProvider.GetPersonById(id); 
    } 
    catch 
    { 
     // I use a try/catch to handle the exception and I return a null value 
     // I don't like this solution but the idea is to handle excpetion in 
     // business to always return valid object to my MVC. 
     person = null; 
    } 
    return person; 
} 

溶液2

public Person GetPersonById(string id) 
{ 
    MyProject.Model.Person person = null; 
    person = _personDataProvider.GetPersonById(id); 
    // I do nothing. It to my MVC to handle exceptions 
    return person; 
} 

溶液3

public Person GetPersonById(string id, ref MyProject.Technical.Errors errors) 
{ 
    MyProject.Model.Person person = null; 
    try 
    { 
     person = _personDataProvider.GetPersonById(id); 
    } 
    catch (Exception ex) 
    { 
     // I use a try/catch to handle the exception but I return a 
     // collection of errors (or status). this solution allow me to return 
     // several exception in case of form validation. 
     person = null; 
     errors.Add(ex); 
    } 
    return person; 
} 

解決方案4

// A better idea ? 

回答

1

我還建議你考慮空對象模式。不要返回null,而是返回一個空對象,以便在空檢查時不必執行多個操作。你應該創建一個具有靜態屬性的抽象Person類,如NullPerson,它包含默認值。如果你的DAL返回null,你將返回NullPerson。你可以在Null Object Pattern找到更多的信息。

0

系統錯誤,應儘快抓住了,而每一個對象的消費類應履行了必要的代碼來捕獲可能出現的錯誤。在最低級別捕獲系統錯誤讓你決定你打算做什麼: - 沒有返回值 - 拋出一個自定義錯誤 - 再次引發系統錯誤

插入系統錯誤,您的自定義錯誤之間的抽象層是您可以引入需要不同關注的新錯誤。 IE瀏覽器:如果錯誤是FileNotFoundException,你可能想在正常錯誤(即:文件是每日報告,但文件asket代表未來報告)或不是(該文件應該存在)之間作出區別

我會更喜歡解決方案3,即使在第一階段,您只需在需要時重新引發常規異常。

塞爾

0

這取決於您的要求。

  1. 如果你只是想知道我們的過程是否成功執行,那麼過程2是可取的。
  2. 如果您願意編寫一些錯誤日誌,那麼Process 3是最佳選擇。
  3. 如果你不想用複雜的方法去處理異常並寫入它的日誌,那麼Process 1是可取的。

問候, Pavan.G

1

讓異常在應用層進行處理。我會建議去解決方案2。如果您想在某些異常發生時更改邏輯,您可以使用try..catch塊,否則只需將其留給應用程序基礎架構即可。

相關問題