处理特定的实体框架例外 - 标准/指南?

时间:2013-06-28 06:48:33

标签: c# .net entity-framework exception entity-framework-5

使用Entity Framework从数据库查询时,应该捕获哪些异常以及应该对它们做些什么?

通常我使用catch(Exception),因为我没有针对每种可能的错误类型采取任何具体行动或反馈,但我不断被提醒,这是一个可怕的想法,应该抓住并处理特定的例外情况!例如:

try
{
    using(MyEntities context = new MyEntities())
    {
        context.Companies.Attach(company);
        ActiveEmployees = company.Employees.Where(x => x.IsActive).ToList();
    }
}
catch(Exception ex)
{
    Feedback(FeedbackType.ApplicationError); // User feedback
    Logger.Log(ex);  // Log the exception
}

处理EF例外的标准/指南是什么?

2 个答案:

答案 0 :(得分:1)

这些少数陈述可能引发了大量例外情况。 您可能没有与数据库的网络连接。 您附加的公司可能附加到另一个上下文。 员工可能不是虚拟的或者不是首先加载的,因此是null。 您必须检查每种方法的文档,并找出可能需要捕获的内容。

但是我的两分钱是你已经把它们全部抓住了,你做的就是你唯一能做到的。 您记录它们并询问用户他/她做了什么。 (可能会给自己发一封电子邮件?)

执行此操作一段时间后,您将有一个日志显示实际发生的异常,您可以决定如何处理它们。但大多数情况下,用户只对知道该网站“已关闭”感兴趣,并将在 n 中备份。

答案 1 :(得分:1)

许多例外不应该被捕获但是被阻止。我的意思是违反FK约束或其他数据库约束的异常,附加已附加的实体,处理上下文时的延迟加载,不支持的LINQ语句等等。应该在单元测试/集成测试中冒泡 。这就是为什么我不会在代码深处使用这样一般的try-catch(它看起来像某种存储库或服务方法)但是更高,例如在UI或视图模型中。他们应该让你的测试崩溃。

我可以想到一个例外,您可能希望捕获并处理接近数据访问代码的问题,那就是乐观并发异常。这是因为在代码中无法完全防止并发冲突(时间总是留下间隙),并且您必须依赖数据库在异常发生时抛出异常。有关如何处理乐观并发的一些模式,请参阅here