Видимость класса исключения?

Использовал С# в течение примерно пяти лет, и только теперь это ударило меня о видимости класса пользовательских исключений. Совершенно законно писать внутренние или даже частные вложенные исключения, например:

internal class WhyDoThis : Exception { }

public class Foo { private class WhyWhyWhy : Exception { } }

Итак, когда вы идете о том, чтобы выбрасывать эти исключения из своих DLL, только люди (меньшинство), которые делают приличную (не покемоновую) обработку исключений, разбивают свои приложения.

Итак, мой вопрос в том, какова цель такого шаблона? Или почему это даже законно?

Ответ 1

Упрощенный ответ был бы таким же законным, как любой плохой код.

Я действительно не могу придумать ничего другого, чтобы сказать здесь, что не выйдет за рамки этого вопроса. Вот как это. Любой, в любое время, может написать код, который, хотя и может компилироваться, просто и просто ужасен.

EDIT:

Я действительно могу думать о одном сценарии, где внутренние исключения могут иметь некоторое применение: для тестирования и утверждения фреймворков, например Кодовые контракты. Но это очень маргинальный случай.

Ответ 2

Нет ничего неправильного с точки зрения наследования/видимости, чтобы иметь внутренние/частные исключения. Это точно так же, как предоставление частного класса для реализации открытого интерфейса. Тот, кто использует этот объект снаружи, не сможет (не до рефлексии) получить информацию, которая не отображается через открытый интерфейс/базовый класс.

Таким образом, в случае исключения внешние вызывающие абоненты смогут уловить общедоступное базовое исключение, даже если вы запускаете особое частное исключение. Вы можете сделать это, чтобы предоставить пользовательский ToString, например.

Обратите внимание, что частные/внутренние исключения, вероятно, являются плохими идеями, так как целая причина бросать конкретное исключение - это позволить кому-то поймать определенный.

Также проверьте "Создание пользовательских исключений" , чтобы убедиться, что ваши классы исключений полезны во всех случаях (например, для междоменных исключений требуется сериализация).

Ответ 3

Одна цель - исключение, используемое внутренне для сборки (или даже конфиденциально для класса), но где исключение никогда не ускользает от сборки (или класса). В этом случае вы не захотите, чтобы он стал видимым вне сборки (или класса).

В этом случае это, очевидно, было бы ошибкой, если бы исключение состояло в том, чтобы избежать сборки (или класса).