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

标签 c# exception

我正在调用一个抛出自定义异常的函数:

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;
}

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

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

try
{
   DoSomething();
}
catch (SqlException e)
{
   if (e.Number = 247) 
   {
      return "Someone";
   }
   else
      throw;
}

我考虑过在 SqlException 被抛出时立即捕获它,并将各种值复制到重新抛出的异常中 - 但该代码不依赖于 Sql。它遇到了 SqlException,但它不依赖于 SqlException。

我考虑过捕获所有异常:

try
{
   DoSomething(...);
}
catch (Exception e)
{
   SqlException ex = HuntAroundForAnSqlException(e);
   if (ex != null)
   {
      if (e.Number = 247) 
      {
          return "Someone";
      }
      else
         throw;
   }
   else
      throw;
}

但那是可怕的代码。

鉴于 .NET 不允许您更改 ExceptionMessage 以包含其他信息,捕获原始异常的预期机制是什么?

最佳答案

您需要 c# 6/visual studio 2015 才能使用谓词执行此操作:

catch (ArgumentException e) when (e.ParamName == “…”)
{
}

Official C# Try/Catch Documentation

关于c# - 如何在 C# 中捕获原始(内部)异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8791539/

相关文章:

c# - 在 C# 中访问 C++/CLI 重载 [] 运算符

C#通过键列表从字典中获取值子集

c# - out var _ 和 out _ 的区别?

python - 在异步收集中捕获异常

c# - CSS 中的 LinkedResource

java - JAXB异常处理

c# - 如何在 IIS 中显示详细的堆栈跟踪?

python - 在 Python 中引发基于非异常的异常会产生不同的结果

java - 异常处理 try catch inside catch

c# - 在哪里关闭SqlDataReader对象和SqlConnection对象?