0

我有一個使用實體框架6.0的MVC Razor應用程序。但是,如果數據庫出現故障,我的代碼開始在各種隨機地方拋出異常,例如當我開始評估我的IEnumerable<T> s和IQueryable<T> s時。在一個地方處理'打開底層提供程序失敗'

模型的構造函數是生成的代碼,如果我修改它,這將不會幫助,因爲構造函數不會引發異常,將被覆蓋。相反,異常進來這樣

using (var dataContext = new ArchiveVMADDatabase.ArchiveDatabaseModel()) 
{ 
    IQueryable<HDeploy> deploys = Helpers.GetProdDeploysFromArchive(dataContext); 

    var query = getBranchSelectListQuery(deploys); 
    listItems.AddRange(query);// EXCEPTION IF DB IS DOWN 
} 

地方有沒有好的辦法,我在一個地方進行處理並避免巨大的try catch塊包裝幾乎100%的我的代碼?如果它不能與數據庫交談,我真的希望只返回空集。

回答

0

我不確定您是否正在使用MVC或Web API,但在Web API中使用Exception Filters來集中異常處理。

一個異常過濾器基本上是ExceptionFilterAttribute的衍生物,它可以創建根據捕捉到的異常具體的迴應:

public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext context) 
    { 
     if (context.Exception is NotImplementedException) 
     { 
      context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented); 
     } 
    } 
} 

你不需要添加任何地方塊try {} catch {} - 網頁API觸發配置只要異常到達系統的最外層(即控制器級別),異常過濾器就會自動進行過濾。

您只能針對特定的ApiController或全局的每個控制器激活例外過濾器。

相關問題