Я вызываю функцию, которая генерирует настраиваемое исключение:
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
, чтобы включить дополнительную информацию, каков предполагаемый механизм для обнаружения оригинальных исключений?