Создать пользовательское исключение или использовать встроенные исключения?

В настоящее время я нахожусь в процессе записи клиентского класса, который использует DNS, Сокеты и SSL среди других классов та любовь для выдавания исключения. Другие люди будут реализовывать этот класс, таким образом, я задавался вопросом, что лучшая практика для того, чтобы выдать исключения.

Я должен создать свое собственное исключение, таким образом, они знают, что это - мой класс, выдающий исключение, или я должен позволить классы и методы, которые я называю (DNS, Сокеты, и т.д.) для выдачи их собственных исключений? В настоящее время код находится в сотнях строк и растущий со многими различными вызовами метода. Какова лучшая практика для того, чтобы выдать исключения в этой ситуации?

11
задан krs1 9 August 2010 в 19:42
поделиться

5 ответов

Если в BCL есть классы, которые уже передают нужный вам смысл (ArgumentNullException, например), используйте их.

Оставьте использование собственных классов исключений для вещей, специфичных для вашего API.

Если вы чувствуете, что можете добавить информацию, то, конечно, поднимите собственное исключение, но не проглатывайте исключения - распространяйте их как собственные внутренние исключения.

20
ответ дан 3 December 2019 в 02:51
поделиться

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

Если вы перехватываете одно исключение и генерируете новое, присвойте старое исключение свойству InnerException нового. Таким образом вы можете вложить столько исключений, сколько необходимо, что создает иерархическое «представление» о том, как распространяется исключение, что очень полезно для отладки.

6
ответ дан 3 December 2019 в 02:51
поделиться

Худшее, что вы можете сделать, - это выбросить ApplicationException с подробной информацией в строке сообщения. ЕСЛИ вам нужно это сделать, пришло время для пользовательского исключения.

2
ответ дан 3 December 2019 в 02:51
поделиться

Это действительно зависит от вашей аудитории, то есть потребителей вашего класса.

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

Если вы действительно создаете настраиваемые исключения, обязательно включите исходное исключение в InnerException вашего настраиваемого исключения, если только у вас нет явной причины его скрыть. Это даст людям, использующим ваш класс, больше всего доступной информации, а также накроет вас, если произойдет исключение, которое ваш класс не покрывает полностью.

1
ответ дан 3 December 2019 в 02:51
поделиться

Если вы хотите, чтобы кто-то мог отлавливать и восстанавливать ваши исключения, лучше всего использовать небольшую иерархию пользовательских типов исключений, вероятно, организованных по ожидаемой степени восстанавливаемости (например. иметь тип исключения, указывающий на "произошло что-то непредвиденное, но сокет, вероятно, все еще хорош", другой - на "состояние сокета нельзя доверять, но начать заново с нового сокетного соединения может сработать", третий - на "хост говорит, что то, что вы делаете, не сработает; даже не пытайтесь повторить попытку, если у вас нет оснований полагать, что что-то изменилось"). Детали того, что вызвало исключение, часто менее важны для "ловящего" кода, чем природа нарушенных постусловий.

1
ответ дан 3 December 2019 в 02:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: