Создать собственное исключение или использовать встроенные исключения? - PullRequest
11 голосов
/ 09 августа 2010

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

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

Ответы [ 5 ]

20 голосов
/ 09 августа 2010

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

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

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

6 голосов
/ 09 августа 2010

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

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

2 голосов
/ 09 августа 2010

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

1 голос
/ 10 августа 2010

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

1 голос
/ 09 августа 2010

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

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

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

...