Я вызываю функцию, которая выдает пользовательское исключение:
GetLockOwnerInfo(...)
Эта функция, в свою очередь, вызывает функцию, которая выдает исключение:
GetLockOwnerInfo(...)
ExecuteReader(...)
Эта функция, в свою очередь,вызывает функцию, которая выдает исключение:
GetLockOwnerInfo(...)
ExecuteReader(...)
ExecuteReader(...)
И так далее:
GetLockOwnerInfo(...)
ExecuteReader(...)
ExecuteReader(...)
ExecuteReaderClient(...)
Fill(...)
Одна из этих функций выдает SqlException
, хотя этот код не имеет представления о том, что SqlException
is.
Оберните более высокие уровни, которые 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
чтобы включить дополнительную информацию, каков механизм обнаружения исходных исключений?