【问题标题】:Handle 'underlying provider failed on open' in one place在一处处理“基础提供商在打开时失败”
【发布时间】:2016-08-09 16:26:16
【问题描述】:

我有一个使用实体框架 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
}

有没有一种好方法可以让我在一个地方处理这个问题并避免将我近 100% 的代码包装在巨大的 try catch 块中?如果它不能与数据库对话,我真的很想让它返回空集。

【问题讨论】:

    标签: c# entity-framework exception-handling entity-framework-6 code-reuse


    【解决方案1】:

    我不确定您使用的是 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 {} 块——一旦异常到达系统的最外层(即控制器级别),Web API 就会自动触发配置的异常过滤器。

    您可以仅为特定的ApiControllers 或为每个控制器全局激活异常过滤器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多