0

使用实体框架从数据库中查询时,应该捕获哪些异常以及应该如何处理它们?

通常我使用它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 异常的标准/指南是什么?

4

2 回答 2

1

这几条语句可能会引发大量异常。您可能没有到数据库的网络连接。您附加的公司可能附加到另一个上下文。员工可能不是虚拟的或一开始就没有加载,因此为空。您必须检查每种方法的文档并找出可能需要捕获的内容。

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

这样做一段时间后,您将有一个日志显示实际发生了哪些异常,您可以决定如何处理它们。但大多数情况下,用户只对知道该站点“关闭”并将在n中备份感兴趣。

于 2013-06-28T06:56:35.537 回答
1

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

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

于 2013-06-28T07:56:00.837 回答