【问题标题】:A fast and efficient way to get the needed Inner Exception获取所需内部异常的快速有效方法
【发布时间】:2018-03-28 11:17:29
【问题描述】:

在使用 Entity Framework 6 的应用程序中,我在一个专门设计的实体中跟踪对数据库中的表所做的更改。他们跟踪所有表的更改,包括他们自己的表。

因此,如果在数据库中保存更改时发生异常,我会删除所有待处理的跟踪实体,以避免递归创建新的和新的跟踪器,记录异常并退出保存方法。

但是,如果由于连接超时导致异常,我尝试 3 次重新保存更改,同时更改跟踪实体的 EntityState 以避免创建不必要的跟踪器。为了做到这一点,我需要捕获一个 DbUpdateException,将 SqlException 放到异常层次结构中,并检查它的编号。但是,我不确定层次结构中的 SqlException 有多深。为了成功获取 Sql 异常,我写了这个:

catch (DbUpdateException duEx)
{
   var inner = new Exception();
   inner = duEx;
   do
   {
      inner = inner.InnerException;
   }
   while (!(inner is SqlException) && inner != null);

   var innerEx = inner as SqlException;

   if (innerEx != null && innerEx.Number == -2)
   {
      //do job here
   }

我测试了它,它似乎可以工作,但是它看起来有点笨拙。所以我的问题是:有没有办法直接获取 SqlException,如果有的话?

【问题讨论】:

  • 与实际与数据库服务器通信的时间相比,“快”在这里是一个有争议的问题;你几乎可以做任何事情(除了Thread.Sleep),与实际的数据库调用相比,它仍然为零。如果你的意思是“作为调用者对我来说很方便”——也许添加一个 TryGetSqlException 扩展方法,这样你就可以编写一次并在很多地方使用它?
  • @MarcGravell 也许“方便”是我想要使用的确切词。我想知道是否已经有一些我可以使用的第 3 方扩展方法,而不是自己编写。也许我听起来太懒了。

标签: c# entity-framework exception entity-framework-6 sqlexception


【解决方案1】:

我想知道是否已经有第 3 方 我可以使用的扩展方法

不,但您可以自己创建:

public static class Helper
{
    public static TException GetInnerException<TException>(this Exception ex) where TException : Exception
    {
         return ex.InnerException != null 
             ? ex.InnerException as TException ?? GetInnerException<TException>(ex.InnerException)
             : null;
    }
}

并使用它:

catch (DbUpdateException duEx)
{
   if (duEx.GetInnerException<SqlException>()?.Number == -2)
   {
      //do job here
   }
}

【讨论】:

  • 谢谢。递归看起来更紧凑。
猜你喜欢
  • 2013-02-23
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
相关资源
最近更新 更多