Почему .NET-исключения не работают против интерфейса, а не базового класса?

Фреймворк .Net позволяет отлавливать только те типы, которые наследуются от базового класса "System.Exception". Почему это не мог быть интерфейс типа "System.IException"?

Use case

We use a custom base class in each API that inherits off 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

Единственный способ теперь обрабатывать оба этих типа - это иметь два пользовательских базовых типа и дублировать каждое утверждение ловушки.

Рефакторинг

Если бы фреймворк .net просто искал что-то вроде System.IException, то вы могли бы просто иметь пользовательский интерфейс исключения, такой как CompanyName.ILoggedException, наследуя System.IException, который реализуется всеми вашими пользовательскими типами исключений. Таким образом, ваш новый код подхвата будет выглядеть примерно так:

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?

17
задан Stephen Kennedy 13 March 2018 в 22:49
поделиться