Я создаю библиотеку, которая содержит несколько методов для синтаксического анализа строковых дат и времени. Мне трудно решить, какое исключение эти методы следует использовать, когда строковый аргумент не обрабатывается. Я рассматриваю несколько вариантов:
1. java.lang.IllegalArgumentException
- неверная строка явно является незаконным аргументом, но для меня IllegalArgumentException
обычно означает ошибку программирования, и редко бывает необходимо сделать явный try catch
для одного. Я считаю, что синтаксический анализ часто используется для внешнего ввода и представляет собой особый случай, заслуживающий особого внимания. Если, скажем, у вас был большой блок кода, который анализировал ввод пользователя и делал что-то еще с ним, вы можете захотеть обернуть этот код в блок catch try, чтобы вы могли обработать случай ввода пользователя, содержащий недопустимую строку. Но ловить IllegalArgumentException
было бы не очень удобно для определения неверного ввода пользователя, потому что, скорее всего, в вашем коде было бы несколько мест, из которых он мог бы быть удален (не только синтаксический анализ пользователя).
2. java.lang.NumberFormatException
- он подбрасывается Integer.parseInt(String)
и другими подобными методами анализа в java.lang
. Поэтому большинство разработчиков Java знакомы с тем, что это исключение для catch, когда вы пытаетесь разобрать строку, которая может быть или не быть действительной (например, пользовательский ввод). Но он получил "Number" в своем названии, поэтому я не уверен, что он действительно подходит для таких вещей, как даты и времена, которые в некотором смысле являются числовыми, но концептуально разные в моем сознании. Если бы это называлось "FormatException"...
3. java.text.ParseException
- не вариант, потому что он проверен. Я не хочу отмечать это.
4. Пользовательское исключение - это обходит нижние стороны IllegalArgumentException
и NumberFormatException
, и это может также расширить IllegalArgumentException
. Но я не думаю, что это хорошая идея добавить исключения в библиотеку, если они действительно не нужны. Цитата Джоша Блоха, "Если есть сомнения, оставьте это" . (Кроме того, в моем случае для пакета, который анализирует даты и время, довольно сложно назвать такое исключение: "DateFormatException", "TimeFormatException", "CalendricalFormatException" (например, JSR 310) - ничто не кажется идеальным для меня при применении к методам которые анализируют даты, времена, даты и т.д. И я думаю, было бы глупо создавать несколько исключений в одном пакете, если бы они были просто использованы для идентификации непревзойденных строк.)
Итак, какой вариант, по вашему мнению, имеет наибольший смысл?
NB Есть веские причины для меня не желать использовать java.util.Date или Joda Time, или JSR 310, поэтому нет необходимости предлагать их. Плюс, я думаю, было бы хорошо, если бы этот вопрос оставался достаточно общим, так как это должно быть проблемой, с которой боролись другие люди, разрабатывающие API. Даты и время также могут быть IP-адресами или URL-адресами или любой другой информацией, которая имеет строковые форматы, требующие разбора.
Прецеденты, установленные другими библиотеками
Всего несколько примеров, которые я нашел:
java.sql.Timestamp.valueOf(String) throws IllegalArgumentException
java.util.Date.parse(String) throws IllegalArgumentException
(устаревший метод, и исключение не объявлено, но вы можете увидеть его в источнике)
java.util.UUID.fromString(String) throws IllegalArgumentException
org.apache.axis.types.Time(String) throws NumberFormatException
(также Day class в оси Apache)
org.apache.tools.ant.util.DeweyDecimal(String) throws NumberFormatException
com.google.gdata.data.DateTime.parseDateTime(String) throws NumberFormatException
java.lang.Package.isCompatibleWith(String versionString) throws NumberFormatException
(в Java 7 это принимает номер версии строки с точками - вроде даты или времени в некотором смысле)
Я уверен, что существует множество пакетов, в которых используется настраиваемое исключение, поэтому я сомневаюсь, что есть много примеров в их примерах.