如何决定创建已检查的excpetion或未经检查的exception

我想知道如何创建并抛出已检查的exception或未经检查的exception。

例如,我有一个服务,它使用一些数据并在使用之前validation它。 在validation期间,某个字段不符合规则,我想抛出一个exception,如ValidationException()。 我怎么知道应该检查或取消选中它。

在另一种情况下,我从我的代码中调用外部Web服务,例如google stock api。 我们假设我的超时时间为3秒。 如果时间exprires我想抛出exception说BackendException()。 我怎么知道它应该是一个已检查的exception还是一个未经检查的exception。

提前致谢。

可能有不同的意见,但我会说不同的是调用者应该如何处理该exception:

  • 如果要确保调用者通过执行某些操作(记录,尝试恢复等)或重新抛出来处理exception,请使用已检查的exception。 一个例子是ValidationException :如果数据无效,调用者应该处理它,例如通过告诉某人修复数据或尝试其他东西。
  • 您不希望强制调用者处理通常不应抛出的exception(例如编程错误等)使用未经检查的exception。 一个例子可能是总是可怕的NullPointerException :不应该发生你想要使用的东西是null,因此它可能被认为是编程错误。 如果某些内容可能为null,但您不应该使用已检查的exception。

    请注意,某些库/方法使用IllegalArgumentException ,这是一个未经检查的exception。 如果抛出此exception,则通常存在编程错误,因为违反了方法的约定(例如,参数值不能为负),并且调用者应该修复代码或自己进行一些检查。

另一种观点可能是:在某些情况下是否会抛出exception? 预期的exception(仍然意味着发生某种错误)将被检查exception,因为这样你就会告诉调用者他应该期望在某些情况下抛出这些exception(例如,如果数据无效)。 如果exception是意外的,你不应该强制调用者处理这样的exception,因为你根本不会指望它被抛出 – 因此它将是一个未经检查的exception。

根据Joshua Bloch,Book Effective Java,第58项将它汇总在一行中。 Thumb规则是对可恢复条件使用已检查exception,对编程错误使用运行时exception。