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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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