在EF6中捕获并发异常以更改消息以使用户更友好

时间:2015-06-22 08:59:28

标签: 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 (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;
}

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

1 个答案:

答案 0 :(得分:2)

您正在执行异步方法。这意味着当您在返回的任务上调用await或尝试使用await myTask;

检索结果时,将抛出任何异常

你永远不会这样做,这意味着异常被抛出并被提升到你的调用堆栈。

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

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

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

显示好消息最好留给控制器。