C# 获取所需内部异常的快速高效方法
在使用EntityFramework6的应用程序中,我在一个专门设计的实体中跟踪对数据库中的表所做的更改。它们跟踪所有表上的更改,包括它们自己的表 因此,如果在数据库中保存更改时发生异常,我将删除所有挂起的跟踪实体,以避免递归创建新的跟踪器,记录异常并退出保存方法 但是,如果异常是由于连接超时引起的,我会尝试3次重新保存更改,同时更改跟踪实体的EntityState以避免创建不必要的跟踪器。为了实现这一点,我需要捕获一个DbUpdateException,从异常的层次结构中获取SqlException,并检查其编号。但是,我不确定SqlException在层次结构中的深度。为了成功获取Sql异常,我编写了以下代码:C# 获取所需内部异常的快速高效方法,c#,entity-framework,exception,entity-framework-6,sqlexception,C#,Entity Framework,Exception,Entity Framework 6,Sqlexception,在使用EntityFramework6的应用程序中,我在一个专门设计的实体中跟踪对数据库中的表所做的更改。它们跟踪所有表上的更改,包括它们自己的表 因此,如果在数据库中保存更改时发生异常,我将删除所有挂起的跟踪实体,以避免递归创建新的跟踪器,记录异常并退出保存方法 但是,如果异常是由于连接超时引起的,我会尝试3次重新保存更改,同时更改跟踪实体的EntityState以避免创建不必要的跟踪器。为了实现这一点,我需要捕获一个DbUpdateException,从异常的层次结构中获取SqlExcept
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也许“方便”正是我想要使用的词。我想知道的是,是否已经有一些第三方的扩展方法,我可以使用,而不是写我自己的。也许我听起来太懒了。谢谢。使用递归看起来更紧凑。