为什么在Entity Framework的SaveChanges()方法中无法捕获SqlException?

15

我在 try/catch 块中放置了 SaveChanges() 方法,但无法捕获 SqlException 异常。

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

6
期望的行为已经被解释并且明显易懂。问题陈述清晰明了。不明白为什么会被投票反对... - maplemale
4
我对关闭这个话题提出异议。这显然是一个主题,甚至有示例代码展示了预期的行为。希望我们能投票反对那些投票关闭它的人。 - Ed Landau
1
应该重新开放并分配已接受的答案 @usr - Vernard Sloggett
问题本身没有问题,只是表述不够清晰。应该这样说:“我正在尝试捕获 SqlException 来处理 SaveChanges() 抛出的数据库错误。但是当我使用 'catch (SqlException ex)' 时,异常从未被捕获。如果我改用 'catch(Exception ex)',那么它就可以工作了。为什么会这样?在调试器中显示的异常类型是 SqlException。” - Simon_Weaver
2个回答

17
"

SqlException 是 System.Data.SqlClient.SqlException 类,因此无法捕获此异常。根据 MSDN,EntityFramework的DbContext.SaveChanges Method()方法只能抛出以下异常:

"
DbUpdateException
DbUpdateConcurrencyException    

DbEntityValidationException 

NotSupportedException   

ObjectDisposedException 


InvalidOperationException    

所以你可以像这样做,例如

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

更多
上述的异常是Entity Framework定制化异常,只有EF负责何时和如何触发它们,请参考实现自定义异常


1
我不知道为什么这个问题被关闭了,从回复中很明显可以看出它有一个容易识别的答案,所以如果简单的话,这是一个好问题。以下是我最终采取的方法,以获取我的用户界面的根SQL错误:catch (Exception ex) { while (ex.InnerException != null) ex = ex.InnerException; spanError.Text = ex.Message; } - Vernard Sloggett
您的顺序有误。您应该先捕获 DbUpdateConcurrencyException,然后再捕获 DbUpdateException - Hello

5

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

Entity Framework是一个抽象层,用于与数据库交互,它不直接依赖于任何数据库技术。

请查看由DbContext.SaveChanges()引发的异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接