我正在调用一个抛出自定义异常的函数:
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 不允许您更改 Exception
的 Message
以包含其他信息,捕获原始异常的预期机制是什么?
最佳答案
您需要 c# 6/visual studio 2015 才能使用谓词执行此操作:
catch (ArgumentException e) when (e.ParamName == “…”)
{
}
关于c# - 如何在 C# 中捕获原始(内部)异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8791539/