我有一个使用实体框架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块中吗?如果它无法与数据库通信,我真的想让它返回空集。
答案 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
激活例外过滤器,或为每个控制器全局激活例外过滤器。