0

我想知道如何知道如何创建并抛出一个已检查的异常或未经检查的异常。如何决定创建一个已检查的异常或未经检查的异常

例如,我有一个服务,它使用它之前需要一些数据并验证它。在验证过程中,某个字段不符合规则,我想抛出异常说ValidationException()。我如何知道决定应该检查还是不检查。

在另一种情况下,我从我的代码调用外部Web服务,例如谷歌股票API。假设我有3秒的超时时间。如果时间exprires我想抛出异常说BackendException()。我怎么知道它应该是一个检查异常还是一个未检查的异常。

在此先感谢。

+0

最好从未经过检查的例外开始。然后,如果您发现很多编程错误是由于未处理异常而产生的,现在可以考虑将特定的异常转换为已检查的异常。 –

+0

一般的经验法则是:如果一个异常只是一个“失败”,没有特殊的处理,除了记录它并使请求失败,它应该被取消选中。 –

+0

另请参见:[何时选择checked和unchecked exceptions](http://stackoverflow.com/questions/27578/when-to-choose-checked-and-unchecked-exceptions?rq=1) –

回答

3

可能有不同的意见,但我想说的区别是调用者应该如何处理该异常:

  • 如果你想无论是做一些事情,以确保来电处理异常(日志记录,试图恢复等)或重新抛出,然后使用检查的异常。一个例子是ValidationException:如果数据无效,则调用者必须处理该数据,例如,通过告诉某人修复数据或尝试其他方法。
  • 它你不想强迫调用者处理异常,通常不应该被抛出(例如编程错误等)使用未经检查的异常。一个例子可能是总是令人害怕的NullPointerException不应该发生,你想使用的东西是空的,所以它可能被认为是一个编程错误。如果某些东西可能为空,但不应该使用检查的异常。

    请注意,某些库/方法使用IllegalArgumentException这是一个未检查的异常。如果抛出这个异常,通常会有一个编程错误,因为方法的约定(例如参数值不能是负数)被违反,调用者应该修复代码或自己做一些检查。

另一种观点可能是:在某些情况下预计会抛出异常吗?预期的异常(这仍然意味着某种错误发生)将被检查异常,因为这样你会与调用者通信,他应该期望在某些情况下抛出异常(例如,如果数据无效)。如果异常是意外的,你不应该强制调用者处理这样的异常,因为你不希望它被抛出 - 因此它将是一个未经检查的异常。

1

根据Joshua Bloch,Book Effective Java,Item 58将其汇总为一行。 Thumb规则是对可恢复条件使用checked checked异常,对编程错误使用运行时异常。

+0

请注意,只记录异常或打印其堆栈跟踪不是从中“恢复”。 – VGR