处理特定实体框架例外情况——标准/指南
本文关键字:情况 标准 指南 实体 框架 处理 | 更新日期: 2023-09-27 18:20:10
当使用实体框架从数据库中查询时,应该捕获哪些异常以及应该如何处理
一般来说,我使用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异常的标准/指南是什么?
许多异常不应该被捕获,而应该被阻止。我的意思是,违反FK约束或其他数据库约束、附加已经附加的实体、在处理上下文时延迟加载、不支持的LINQ语句等异常情况。应该在单元测试/集成测试中出现。这就是为什么我不会在代码的深处使用这样一个通用的try-catch(它看起来像某种存储库或服务方法),而是在更高层,例如在UI或视图模型中。他们应该让你的测试崩溃。
我可以想到一个异常,您可能想在数据访问代码附近捕获和处理它,那就是乐观并发异常。这是因为在代码中无法完全防止并发冲突(时间总是会留下间隙),并且在发生异常时必须依赖数据库来抛出异常。有关如何处理乐观并发的一些模式,请参阅此处。
这几条语句可能会引发大量异常。您可能没有与数据库的网络连接。您附加的公司可能附加到另一个上下文。员工可能不是虚拟的,或者一开始就没有加载,因此为null。您必须检查每个方法的文档,并找出可能需要捕获的内容。
但我的两分钱是,你已经把它们都抓了,你做了你唯一能做的事。您记录它们并询问用户他/她做了什么。(可能给自己发封电子邮件吗?)
这样做一段时间后,您将获得一个日志,显示实际发生的异常,然后您可以决定如何处理它们。但大多数情况下,用户只想知道网站"关闭",并将在n中备份。