C# 获取所需内部异常的快速高效方法

C# 获取所需内部异常的快速高效方法,c#,entity-framework,exception,entity-framework-6,sqlexception,C#,Entity Framework,Exception,Entity Framework 6,Sqlexception,在使用EntityFramework6的应用程序中,我在一个专门设计的实体中跟踪对数据库中的表所做的更改。它们跟踪所有表上的更改,包括它们自己的表 因此,如果在数据库中保存更改时发生异常,我将删除所有挂起的跟踪实体,以避免递归创建新的跟踪器,记录异常并退出保存方法 但是,如果异常是由于连接超时引起的,我会尝试3次重新保存更改,同时更改跟踪实体的EntityState以避免创建不必要的跟踪器。为了实现这一点,我需要捕获一个DbUpdateException,从异常的层次结构中获取SqlExcept

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

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

但是,如果异常是由于连接超时引起的,我会尝试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(如果有的话)

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

没有,但您可以自己创建:

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;
    }
}
公共静态类帮助器
{
公共静态TException GetInnerException(此异常ex),其中TException:Exception
{
返回ex.InnerException!=null
?ex.InnerException作为TexException??GetInnerException(ex.InnerException)
:null;
}
}
并使用它:

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

与实际与数据库服务器对话的时间相比,“快速”在这里是一个没有意义的点;您几乎可以做任何事情(除了
线程.Sleep
),与实际的DB调用相比,它仍然是零。如果你的意思是“方便我作为调用者”-也许可以添加一个
TryGetSqlException
扩展方法,这样你就可以编写一次并在很多地方使用它?@marcGravel也许“方便”正是我想要使用的词。我想知道的是,是否已经有一些第三方的扩展方法,我可以使用,而不是写我自己的。也许我听起来太懒了。谢谢。使用递归看起来更紧凑。