Я делаю библиотеку, которая содержит несколько методов для анализа строковых дат и времени. Мне трудно решить, какое исключение должны вызывать эти методы, когда строковый аргумент не разбирается. Я рассматриваю несколько вариантов:
1. java.lang.IllegalArgumentException
- недопустимая строка явно является недопустимым аргументом, но для меня IllegalArgumentException
обычно означает ошибку программирования, и редко требуется сделать явное try catch
для одного. Я думаю, что разбор строк часто используется для внешнего ввода и является более частным случаем, который заслуживает особого отношения. Если, скажем, у вас был большой блок кода, который анализировал пользовательский ввод и делал с ним что-то еще, вы можете захотеть обернуть этот код в блок try catch, чтобы вы могли обработать случай пользовательского ввода, содержащего недопустимую строку. Но перехват IllegalArgumentException
не был бы хорош для точного определения неверного пользовательского ввода, потому что, скорее всего, в вашем коде было бы несколько мест, из которых он мог бы быть сгенерирован (а не только разбор пользовательского ввода).
2. java.lang.NumberFormatException
- он генерируется Integer.parseInt(String)
и другими подобными методами синтаксического анализа в java.lang
. Поэтому большинству разработчиков Java известно, что это исключение, которое нужно отлавливать, когда вы пытаетесь проанализировать строку, которая может или не может быть действительной (например, пользовательский ввод). Но у него есть «Число» в его названии, поэтому я не уверен, что оно действительно подходит для таких вещей, как даты и время, которые в некотором смысле являются числовыми, но концептуально отличаются в моем представлении. Если бы только это называлось "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
(также Дневной класс по Apache Axis)
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 для этого используется номер строковой версии с точками - вроде как дата или время в некотором смысле)
Я уверен, что есть много пакетов, которые используют пользовательские исключения, поэтому я сомневаюсь, что есть много смысла приводить примеры таких.