CSharp - 在 C# 中,如何捕获原始的( 内部) 异常?

  显示原文与译文双语对照的内容

调用一个引发自定义异常的函数:


GetLockOwnerInfo(...)



这里函数又调用引发异常的函数:


GetLockOwnerInfo(...)


 ExecuteReader(...)



这里函数又调用引发异常的函数:


GetLockOwnerInfo(...)


 ExecuteReader(...)


 ExecuteReader(...)



等等:


GetLockOwnerInfo(...)


 ExecuteReader(...)


 ExecuteReader(...)


 ExecuteReaderClient(...)


 Fill(...)



其中一个函数抛出一个 SqlException,尽管该代码不知道 SqlException 是什么。

高级级别将 SqlException 封装为另一个 BusinessRuleException,以便包含一些特殊属性和其他详细信息,同时包含"原"异常作为 InnerException:


catch (DbException ex)


{


 BusinessRuleExcpetion e = new BusinessRuleException(ex)


. . .


 throw e;


}



高级级别将 BusinessRuleException 封装为另一个 LockerException,以便包含一些特殊属性和其他详细信息,同时包含"原"异常作为 InnerException:


catch (BusinessRuleException ex)


{


 LockerException e = new LockerException(ex)


. . .


 throw e;


}



现在问题是我想捕获 origianl SqlException,检查特定的错误代码。

但是没有办法"捕获内部异常":


try


{


 DoSomething();


}


catch (SqlException e)


{


 if (e.Number = 247) 


 {


 return"Someone";


 }


 else


 throw;


}



我想在引发 SqlException 时正确捕捉,并将不同的值复制到引发的异常- 但该代码不依赖 Sql 。 它遇到了 SqlException,但它对sql没有依赖性。

我想捕捉所有异常:


try


{


 DoSomething(...);


}


catch (Exception e)


{


 SqlException ex = HuntAroundForAnSqlException(e);


 if (ex!= null)


 {


 if (e.Number = 247) 


 {


 return"Someone";


 }


 else


 throw;


 }


 else


 throw;


}



但那是可怕的代码。

假设. NET 不允许更改 ExceptionMessage 以包含附加信息,那么要捕获原始异常的机制是什么?

时间: 原作者:

我不想告诉你这个,但你不能捕捉到内部异常。

你可以做的是,检查一下,一。

我建议你捕获高级异常( 我相信是 LockerException ) 并检查该异常的InnerException 属性。 检查类型,如果不是 SqlException,请检查该异常的InnerException 。 在找到 SqlException 类型之前遍历每一个,然后获取所需的数据。

也就是说,我同意 dasblinkenlight,如果可以能的--是你的异常框架重构,你应该考虑 -- 。

原作者:
...