在一个地方处理'底层提供商在开放时失败'

时间:2016-08-09 16:26:16

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

我有一个使用实体框架6.0的MVC Razor应用程序。但是,如果数据库已关闭或某事,我的代码会开始在各种随机位置抛出异常,例如当我开始评估IEnumerable<T>IQueryable<T>时。

模型构造函数是生成的代码,如果我修改它将被覆盖,这无论如何都无法帮助,因为构造函数不会抛出异常。相反,例外情况出现在这样的地方

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块中吗?如果它无法与数据库通信,我真的想让它返回空集。

1 个答案:

答案 0 :(得分: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 {}块 - 只要异常到达系统的最外层(即控制器级别),Web API就会自动触发配置的异常过滤器。 / p>

您可以仅为特定ApiController激活例外过滤器,或为每个控制器全局激活例外过滤器。