Я вызываю функцию, которая генерирует настраиваемое исключение:
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, но он не имеет отношения к SqlException.
Я думал об улавливании всех исключений:
try
{
DoSomething(...);
}
catch (Exception e)
{
SqlException ex = HuntAroundForAnSqlException(e);
if (ex != null)
{
if (e.Number = 247)
{
return "Someone";
}
else
throw;
}
else
throw;
}
Но этот ужасный код.
Учитывая, что .NET не позволяет вам изменить Message в Exception, чтобы включить дополнительную информацию, каков предполагаемый механизм для обнаружения оригинальных исключений?