【问题标题】:Exceptions handling EF Core 2.0处理 EF Core 2.0 的异常
【发布时间】:2018-08-29 07:58:55
【问题描述】:

我正在使用带有存储库和工作单元模式的 EF Core 2.0。处理所有数据库异常的最佳方法是什么?我可以在提交方法中只使用 try/catch 吗?

public void Commit()
{
    try
    {
        _context.SaveChanges();
    }
    catch (Exception ex)
    {
         //code
    }
}

SaveChanges() 之外的任何东西都可以抛出异常吗?捕获到的异常接下来应该怎么做?

【问题讨论】:

  • 如果您在如此低的级别上添加异常处理(尤其是捕获基本异常),您将隐藏可能的数据库连接问题以及可能发生的任何其他异常
  • 首先,EF 已经是一个 UoW 和存储库模式,就一般的异常处理而言,让你自己的(10 次中有 9 次)是多余的,而且比它的价值更麻烦,抓住你所知道的 /期望(并且可以处理),让其余的向上传播。没有一种适合所有方法的方法
  • EF DbContext 实现工作单元模式,DbSet 实现存储库模式

标签: c# .net-core entity-framework-core


【解决方案1】:

如果您查看SaveChanges documentation,它表明SaveChanges 只会抛出两种类型的异常:DbUpdateExceptionDbUpdateConcurrencyException。这些是特定于 EF 的异常,它们的内部异常将包含特定于提供程序的异常。

因此,您至少应该明确地捕捉到这些错误,但是如何处理它们取决于您……您绝对应该至少在某个时间点记录错误。通用异常捕获块应该只用于真正意外的情况,但网络中断之类的事情并不是真正的意外。

要记住的另一个例外是DbUpdateException,它是一个由 EF 提供程序(SqlServer、DB2 等)实现的抽象类,据我所知,它会被类似的方法抛出BeginTransactionCommit 等...所以也许也可以处理那个。很容易忘记,这些其他方法也可以在连接断开时抛出异常,而不仅仅是 SaveChanges。

【讨论】:

    猜你喜欢
    • 2021-01-21
    • 2016-04-25
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 2018-09-03
    • 1970-01-01
    相关资源
    最近更新 更多