C# 捕获EF6中的并发异常,以将消息更改为更加用户友好

C# 捕获EF6中的并发异常,以将消息更改为更加用户友好,c#,asp.net,.net,entity-framework,entity-framework-6,C#,Asp.net,.net,Entity Framework,Entity Framework 6,我使用的是EF6.1,我想在抛出以下异常时将消息更改为更系统特定的消息 存储更新、插入或删除语句影响了意外的行数(0) 现在,我的问题是我似乎无法捕捉异常?我尝试了以下方法,但我的断点似乎从未被捕获 public override System.Threading.Tasks.Task<int> SaveChangesAsync() { try { return base.SaveChangesAsync(); } catch (Sys

我使用的是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;
}
public override System.Threading.Tasks.Task SaveChangesAsync()
{
尝试
{
返回base.saveChangesSync();
}
捕获(System.Data.Entity.Core.OptimisticConcurrencyException e)
{
var a=e.消息;
}
catch(System.Data.dbconcurrency异常)
{
var a=e.消息;
}
捕获(例外e)
{
var a=e.消息;
}
返回null;
}

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

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

您从未这样做过,这意味着异常会被抛出并捕获到调用堆栈的更高位置

如果希望在自己的方法中捕获异常,应该将其语法更改为

public override async System.Threading.Tasks.Task<int> SaveChangesAsync()
{
    try
    {
        return await base.SaveChangesAsync();
    }
public override async System.Threading.Tasks.Task savechangessync()
{
尝试
{
return wait base.SaveChangesAsync();
}
但是,在重写
savechangessync
时,我会非常小心。异常包含在其
StateEntries
属性中导致乐观冲突的数据。用漂亮的消息替换它只会使决定如何处理特定错误变得更加困难,例如,决定重写或重新加载


显示一条好消息最好留给您的控制器。

您不尊重
关注点分离原则。关注点分离?“抛出异常以通知调用方发生错误”与“向用户报告错误”完全不同。这称为SoC。如下所述,我现在已更改此项,并将代码移到控制器Hanks。接受建议,将此项添加到控制器。再次感谢