2016-09-20 43 views
0

原諒我的無知,但此刻我正在努力找出捕獲異常並根據異常向客戶端顯示消息的最佳方法類型。異常處理策略 - 從存儲庫捕獲異常並傳遞到WebApi控制器

我的架構:

Page IPageRepository.FindDefault() 
{ 
    try 
    { 
     return MapPageFromCategory.MapFromEntity(_context.tbl_Category. 
          FirstOrDefault(p => 
               p.IsLandingPage == true 
              ) 
        ); 
    } 
    catch (Exception ex) 
    { 
     throw new ApplicationException("Error getting values from database :", ex); 
    } 
} 

通過以上,你可以看到它只是從數據庫中獲取數據,但在某些情況下,我能得到一個object not set to an instance of an object exception由於身體沒有數據在表中或Null exception,這取決於傳入的數據。

現在在這兩種情況下,我想生成一個404異常傳遞給我的控制器。

控制器

public class PageController : ApiController 
{ 
    private IPageRepository _pageRepository; 
    public PageController(IPageRepository pageRepository) 
    { 
     this._pageRepository = pageRepository; 
    } 
    // GET 
    [HttpGet] 
    [Route("")] 
    public Page Get() 
    { 
     return this._pageRepository.FindDefault(); 
    } 
} 

我的控制部HIT的方法和是否有這些例外的被擊中,這將是攔截那些異常,並傳遞給最終客戶(調用應用程序)的最好方法?

再次道歉的問題,真的試圖創建某種系統的方法來處理異常。

謝謝你的時間!

+1

閱讀Eric Lippert的[Vexing Exceptions](https://blogs.msdn.microsoft.com/ericlippert/2008/09/10/vexing-exceptions/) - 它可能會幫助您制定最佳方法。 – Enigmativity

+0

'_context'是一個'DbContext'類型嗎?如果是,我會建議在每個「Repository」方法中創建上下文。因爲如果多個線程嘗試使用相同的'_context',可能會出現奇怪的情況。 – Gabrielius

+0

@Gabrielius是的,它是我的實體從DbContext派生的Context。我的基類(通用EntityRepository)實例化上下文,並在我的派生類(PageRepository)中從基礎中獲取並傳入Ctor,在該Ctor中使用IoC,從而爲該回購創建新實例。 –

回答

0

您可以在Controller類中有單獨的try/catch並處理從存儲庫中拋出的異常,或者做一些不同的事情。

您可以創建一個類類同此:

public class Result 
{ 
    public bool Succeded { get; private set; } 

    protected Result(bool succeeded) 
    { 
     Succeded = succeeded; 
    } 
} 

public class Result<TData> : Result 
{ 
    public TData Data { get; private set; } 

    protected Result(bool succeeded, TData data) : base(succeeded) 
    { 
     Data = data; 
    } 
}  

然後,你可以從你的倉庫返回這一點,並在控制器檢查,如果調用成功。如果不是,則拋出一個期望的異常,相應地設置StatusCode。

+0

我用了一個類似的過程 - 不是確切但相似。其中一條評論中的鏈接幫助我確定了最佳方法。謝謝你的時間。 –