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

Я хочу выдать исключение с определенным именем, и такое исключение уже существует в двустороннем пакете.

Например UnexpectedException в java.rmi, Я не использую никаких средств от rmi packege, но название исключения - именно то , что мне нужно.

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

4 ответа

Решение

То, что имя правильное, еще не значит, что это так. Посмотрите описание, например:

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

Описывает ли это то, что пытается представить ваше исключение? Я подозреваю, что нет.

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

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

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

@Jon Skeet и @akaIDIOT уже дали довольно хорошие ответы. Я просто добавлю пару примеров, имеющих отношение к вашему вопросу:

Было бы странно и запутанно обращаться java.rmi.UnexpectedException из метода, который не имеет ничего общего с RMI.

Также обратите внимание, что основная цель исключений состоит в том, чтобы позволить клиентскому коду справиться с ситуацией, которую вы не смогли бы решить самостоятельно. Так что тот факт, что метод бросает java.io.IOException подразумевает, что клиентский код должен нести ответственность за обработку непредвиденных ошибок ввода-вывода файла (перепроверить доступ к файлу / наличие, основные настройки). Метод метания java.rmi.UnexpectedException дает подсказку клиентскому коду для проверки настроек RMI

Я настоятельно рекомендую НЕ использовать другое исключение только на основании того факта, что оно разделяет имя, которое вы хотите. Например, выбрасывание java.rmi.UnexpectedException вне контекста RMI было бы очень запутанным.

Я не совсем уверен, как именно вы собираетесь использовать свое исключение, но для меня, основываясь исключительно на имени, похоже, что вы могли бы просто использовать java.lang.RuntimeException, поскольку оно имеет то же общее значение.

Поэтому мои рекомендации будут в следующем порядке:

  1. Используйте RuntimeException, если это действительно неожиданное ожидаемое исключение, которое ваш код не готов обработать. Это особенно полезно, если вам действительно не нужны какие-либо новые функциональные возможности, которые уже предоставляет RuntimeException.
  2. Создайте свой собственный класс UnexpectedException. На самом деле нет никаких оснований строго избегать использования определенного имени класса только потому, что какая-то другая библиотека уже использует его. Это один из пунктов пакетов - предоставить пространство имен для устранения неоднозначности одинаковых имен. С современными IDE действительно нет причин для беспокойства. Другие могут не согласиться - это дело вкуса, но я лично не вижу в этом проблемы. Там, конечно, нет технической причины не делать этого.
Другие вопросы по тегам