【问题标题】:Why I can't catch SqlException on SaveChanges() method of Entity Framework为什么我无法在实体框架的 SaveChanges() 方法上捕获 SqlException
【发布时间】:2026-01-05 10:50:01
【问题描述】:

我将SaveChanges() 方法放在try/catch 块中,但我无法捕获SqlExeption。

try
 { 
     db.SaveChanges();
 }
 catch (Exception ex)
 {
 }

【问题讨论】:

  • 所需的行为已解释清楚且显而易见。有明确的问题陈述。好奇为什么这被否决...
  • 我打电话给 BS 来结束这个话题。它显然是主题,甚至有示例代码显示预期的行为是什么。 '希望我们可以否决那些投票关闭它的人。
  • 应该重新打开并分配接受的答案@usr
  • 这个问题很好,只是措辞不好。它应该是这样说的:I am trying to catch SqlException to handle database errors thrown by SaveChanges(). However the exception is never caught when I use 'catch (SqlException ex)'. If instead I put 'catch(Exception ex)' then it does work. Why is this? The type of exception in the debugger shown as SqlException.

标签: c# entity-framework try-catch


【解决方案1】:

SqlException 是 System.Data.SqlClient.SqlException 类所以抓不到这个异常是正常的 EntityFramework DbContext.SaveChanges Method() 只能像 MSDN 一样抛出以下异常

DbUpdateException
DbUpdateConcurrencyException    

DbEntityValidationException 

NotSupportedException   

ObjectDisposedException 


InvalidOperationException    

所以你可以做这样的事情,例如

try
 { 
     db.SaveChanges();
 }
 catch (DbUpdateException ex)
 {
 }
catch (DbUpdateConcurrencyException ex)
 {
 }

更多
上面提到的异常都是实体框架自定义的异常,只有EF负责When和How to trigger他们看看Implementing custom exceptions

【讨论】:

  • 我不知道为什么这个问题被关闭了,从回答中可以明显看出它有一个易于识别的答案,所以如果简单的话,这是一个很好的问题。这就是我最终为我的 ui catch (Exception ex) { 而 (ex.InnerException != null) ex = ex.InnerException; spanError.Text = ex.Message; }
  • 您的订单有误。你应该先捕获DbUpdateConcurrencyException ,然后再捕获DbUpdateException
【解决方案2】:

SqlException 无法捕获,因为它不是直接抛出的,它被设置为DbUpdateException 的内部异常。

实体框架是与数据库一起工作的抽象,它不直接依赖于任何数据库技术。

看看DbContext.SaveChanges()抛出的异常

【讨论】:

    最近更新 更多