Реализация try-catch framework.Net позволяет вам захватывать типы, которые наследуют базовый класс "System.Exception". Почему это не было таким интерфейсом, как "System.IException"?
Использовать регистр
Мы используем собственный базовый класс в каждом API, который наследует System.Exception. Это генерируется только после регистрации исключения, и поэтому мы можем легко избежать повторной регистрации с помощью чего-то вроде:
try
{
// Do something.
}
catch (LoggedException)
{
// Already logged so just rethrow.
throw;
}
catch (Exception ex)
{
// TODO: Log exception.
throw new LoggedException("Failed doing something.", ex);
}
Это здорово, пока вы не захотите создать настраиваемое исключение, которое наследует другой системный тип исключения, например System.FormatException
Единственный способ обработать оба из них - иметь два настраиваемых базовых типа и дублировать каждый оператор catch.
Рефакторинг
Если инфраструктура .net просто искала что-то вроде System.IException, тогда вы могли бы просто создать собственный интерфейс исключений, такой как CompanyName.ILoggedException, наследующий System.IException, который реализует все ваши настраиваемые типы исключений. Поэтому ваш новый код catch выглядит примерно так:
try
{
// Do something.
}
catch (ILoggedException)
{
// Already logged so just rethrow.
throw;
}
catch (IException ex)
{
// TODO: Log exception.
throw new CustomException("Failed doing something.", ex);
}
Существует ли практическая причина, по которой эта структура реализована? Или это будет что-то запрашивать в будущей версии .Net framework?