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

时间:2016-09-22 14:28:37

标签: java exception-handling checked-exceptions unchecked-exception

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

例如,我有一个服务,它使用一些数据并在使用之前验证它。在验证过程中某个字段不符合规则,我想抛出一个异常,如ValidationException()。我如何知道应该选中或取消选中它。

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

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