Java API设计:用于解析半数字字符串的方法的NumberFormatException?

| 我正在制作一个包含一些解析字符串日期和时间的方法的库。我很难确定当字符串参数不可解析时那些方法应该抛出什么异常。我正在考虑几种选择: 1.
java.lang.IllegalArgumentException
-无效的字符串显然是非法的参数,但是,对我来说,
IllegalArgumentException
通常意味着编程错误,并且很少想为一个显式的
try catch
做。我认为字符串解析通常用于外部输入,更多的是特殊情况,值得特殊对待。例如,如果您有一大段代码来解析用户输入并对其进行了其他操作,则可能需要将该代码包装在try catch块中,以便处理用户输入包含无效字符串的情况。但是捕获ѭ1并不能很好地指出无效的用户输入,因为很可能在代码中可能抛出多个位置(而不仅仅是用户输入解析)。 2.
java.lang.NumberFormatException
-
Integer.parseInt(String)
java.lang
中的其他类似解析方法抛出。因此,大多数Java开发人员都熟悉它,因为它是您尝试解析可能有效或无效的字符串(例如用户输入)时捕获的异常。但是它的名称中带有“ Number”,所以我不确定它是否确实适合日期和时间之类的东西,从某种意义上来说,它们是数字,但在我看来却是概念上的不同。如果仅将其称为\“ FormatException \” ... 3.
java.text.ParseException
-并非真正的选项,因为已选中。我要对此取消检查。 4.一个自定义例外-绕过ѭ1和
NumberFormatException
的缺点,它也可能扩展
IllegalArgumentException
。但是我认为除非确实需要例外,否则将例外添加到库中不是一个好主意。引用乔什·布洛赫(Josh Bloch)的话:“如有疑问,请不要理会”。 (对于我来说,对于解析日期和时间的程序包,很难这样的异常命名:\“ DateFormatException \”,\“ TimeFormatException \”,\“ CalendricalFormatException \”(例如JSR 310)-当我将其应用于解析日期,时间,日期时间等的方法时,对我来说似乎没有一个理想的选择。而且我认为,如果它们仅用于标识无法解析的字符串,则在单个包中创建多个异常将是愚蠢的。) 那么您认为哪种选择最有意义? 注意:我有充分的理由不想使用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中的Day类)
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中,它采用带点的字符串版本号-在某种意义上类似于日期或时间) 我确定有很多使用自定义异常的程序包,因此我怀疑给出示例的意义是否很大。     
已邀请:
我本来建议将
IllegalFormatException
作为基类(它继承自
IllegalArgumentException
,但是不幸的是,唯一的构造方法是受程序包保护的,因此我可能会使用 a1ѭ 小API(几种方法) 您自己的继承自ѭ1Class的类层次结构。 无论如何,我都将ѭ1用作基类。 在我以前的项目之一中,指导方针是仅抛出从继承的RuntimeExceptions。
IllegalStateException
IllegalArgumentException
UnsupportedOperationException
尽管这不是官方的教条,但我认为这是一种好习惯。所有这三个都是简单的自我描述。     
我会选择ParseException,因为那是DateFormat.parse抛出的内容。因此,它具有您在2.中提到的优点,程序员对此很熟悉。但是,由于您要取消选中,所以我猜这不是一个选择。如果被迫取消检查,我会选择4。     
对于这个问题,这只是一个品味问题。我认为,我不会抛出异常,但会处理该异常。原因是如果输入错误,用户将无法在异常处理程序中执行任何操作。因此,通过检查返回码可以轻松处理这些类型的错误。例外情况繁重,不会带来额外的价值。     
我目前倾向于使用
NumberFormatException
。我当时以为是普通的旧
IllegalArgumentException
,但是对我来说,当我编写如下代码时,这很不理想:
try {
    final Day day = Day.fromString(userInputString);
    someMethodThatCouldAlsoThrowIllegalArgumentException(day);
} catch (IllegalArgumentException e) {
    ui.showWarningMessage(\"Invalid date: \" + userInputString);
}
假设您解析了一个有效的
Day
,则需要对其进行处理。如果传递给它们的方法接收到无效的参数(即编程错误而不是用户错误),则很可能会抛出“ 1”。在上例中的代码中,您需要注意不要将编程错误与无效的用户输入混为一谈,因此,为了安全起见,您需要在try /之前定义一个空变量(如null变量) catch块,然后检查是否为null。 将
IllegalArgumentException
换为
NumberFormatException
或自定义例外,问题就消失了。 看到JDK 1.7的
java.lang.Package.isCompatibleWith(String versionNo)
NumberFormatException
用于解析版本号的方法(像a35ѭ这样的半数字字符串)后,我认为对于解析日期和日期之类的方法,这也可能是明智的选择。次。
NumberFormatException
对于解析仅是半数字的字符串并不是十分理想,但是当您不想用不需要的自定义异常来弄乱API时,它也许是最佳选择。如果他们在ѭ6中执行此操作,那么按照定义,这可能使其成为Java的处理方式... 我希望它能流行:)     

要回复问题请先登录注册