【问题标题】:Catch concurrency exception in EF6 to change message to be more user friendly在 EF6 中捕获并发异常以将消息更改为更加用户友好
【发布时间】:2015-06-22 08:59:27
【问题描述】:

我正在使用 EF6.1,我想在引发以下异常时将消息更改为更特定于系统的消息。

存储更新、插入或删除语句影响了意外的行数 (0)

现在,我的问题是我似乎无法捕捉到异常?我尝试了以下方法,但我的断点似乎永远不会捕获

public override System.Threading.Tasks.Task<int> SaveChangesAsync()
{
    try
    {
        return base.SaveChangesAsync();
    }
    catch (System.Data.Entity.Core.OptimisticConcurrencyException e)
    {
        var a = e.Message;
    }
    catch (System.Data.DBConcurrencyException e)
    {
        var a = e.Message;
    }
    catch (Exception e)
    {
        var a = e.Message;
    }

    return null;
}

这不是抛出异常吗?这很奇怪

【问题讨论】:

  • 你不尊重Separation of Concerns原则。
  • 关注点分离?
  • “抛出异常通知调用者发生了不好的事情”与“向用户报告错误”完全不同。这称为 SoC。
  • 如下所述,我现在已更改此设置并将代码移至控制器

标签: c# asp.net .net entity-framework entity-framework-6


【解决方案1】:

您正在执行一个异步方法。这意味着当您在返回的任务上调用await 或尝试使用await myTask; 检索结果时,将引发任何异常

您永远不会这样做,这意味着异常会被抛出并在调用堆栈的更高位置被捕获。

如果你想在自己的方法中捕获异常,你应该把它的语法改为

public override async System.Threading.Tasks.Task<int> SaveChangesAsync()
{
    try
    {
        return await base.SaveChangesAsync();
    }

不过,在覆盖 SaveChangesAsync 时,我会非常谨慎。 OptimisticConcurrencyException 异常包含导致其StateEntries 属性中的乐观冲突的数据。用一条好消息替换它只会使决定如何处理特定错误变得更加困难,例如,决定覆盖或重新加载。

显示一个好消息最好留给你的控制器。

【讨论】:

  • 谢谢。接受建议并将其添加到控制器中。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
相关资源
最近更新 更多