Java:声明未经检查的异常的最佳实践

时间:2014-09-09 11:32:27

标签: java exception-handling

让我们假设您有一些方法声明抛出未经检查的异常

编辑:让我们说你不是设计这种方法的人,而是一个非常可敬的框架的作者(Spring,aekhm!),你只是叫它

void someMethod() throws UncheckedException;

我的第一个问题是:

  1. 在throws子句中声明未经检查的异常是否还有其他原因?
  2. 我们假设你有另一种方法可以调用someMethod

    void someOtherMethod() {
        someMethod()
    }
    

    我的第二个问题是:

    1. 决定是否宣布在UncheckedException中投掷someOtherMethod的最佳做法是什么?
    2. 只是一点背景:

      Spring框架的异常基于未经检查的异常。因此,例如,某些方法正在抛出(并在throws中声明它)DataAccessException。如果我的代码正在使用这些调用,它是否应该声明抛出这些异常?为什么?

5 个答案:

答案 0 :(得分:6)

无需在方法的throws ...子句中声明未经检查的异常。如Java Language Specification中所述,“允许但不要求在throws子句中提及未经检查的异常类”。

如果您预计API的用户可能会遇到未经检查的异常,则通常会在Javadoc中列出未经检查的异常。一个常见的例子是列出可能抛出IllegalArgumentException的原因。

如果将一个方法与另一个方法包装在一起,则应用 Effective Java 原则来抛出适合抽象级别的异常(第61项)。这应该适用于已检查的异常和预期的未经检查的异常。

答案 1 :(得分:3)

我建议阅读伟大的书" Effective Java"中的第9章。您将获得所有问题的答案,您将享受到精彩的阅读。

特别为您提问:

  

使用Javadoc @throws标记记录每个未经检查的异常   方法可以抛出,但不要使用throws关键字来包含   方法声明中未经检查的异常

答案 2 :(得分:2)

最佳做法是不要声明未经检查的例外。你没有看到这样的方法:

public void foo() throws NullPointerException {...}

你应该只对Checked Exceptions使用投掷。通过说throws你希望clinet以任何方式处理他的例外情况,而Unchecked Exceptions不适用

编辑:

评论中有一些热烈的讨论,所以只是为了澄清:你不必声明Unchecked Exceptions这并不意味着你不能,尽管在大多数情况下你不应该。我更喜欢在javadoc样式注释中而不是在throws子句中提及它们。还有很多其他例子,你通常不应该做某些事情,但在某些情况下你可能需要这样做。在我看来,底线是:不,你不应该在投注Unchecked Exceptions中列出clause

答案 3 :(得分:0)

在我看来,最好的做法是不要在方法的头部使用throws来进行未经检查的异常,但不要忘记记录方法引发的每个异常(已检查或未检查):

/**
 * Some doc
 * @throws IllegalArgumentException if ...
 */
 public void m() {
     //...
     throw new IllegalArgumentException();
 }

答案 4 :(得分:0)

记录您的API是一件好事,无论是声明抛出还是将@throws添加到您的javadoc都是一种很好的做法。它只会让读者更清楚,这绝不是坏事。我并不总是这样做,但一般来说,你希望人们意识到某些事情可能会失败。我不会为NPE这样做,但输入验证错误或授权错误之类的东西是你可能想要记录的东西。