Java错误处理

时间:2011-05-03 05:47:46

标签: java design-patterns error-handling

我确信你们都知道Java强制执行一个非常严格的错误处理模式,任何异常都必须通过try catch块或使用throws关键字声明一个方法来处理。 (我可能会加上我真的喜欢它完成的方式)

说完了;我正在努力的是决定在各种方法中处理错误的正确方法是什么。来自C#/ VB.NET背景我以前总是严格遵守在堆栈最底层处理错误(除了最具体的情况之外的所有情况),但我不相信这是Java中最好的方法。

有人可以就此提供任何意见吗?什么是最佳做法?如何决定是否应该在方法之外抛出异常或在内部处理它(显然有些情况很明显,但分配不是)?

3 个答案:

答案 0 :(得分:10)

在每个方法的基础上,我问自己:

  1. 此方法是否有足够的信息来正确处理此异常?如果是,请处理它。否则...
  2. 调用者是否有足够的信息来正确处理此异常?如果是,请重新抛出。否则...
  3. 调用者是否需要专门处理此组件的操作失败?如果是,则重新抛出嵌套在组件异常子类中。否则...
  4. Rethrow未经检查。

答案 1 :(得分:1)

这是一个陈腐的答案,但要抓住一个例外,你可以用它来实现恢复。不同的例外意味着您可以在架构中的不同级别处理异常。

答案 2 :(得分:1)

如果且仅当您可以实际执行某些操作来修复它时,您希望处理它发生的异常。

这是一个常见的例子:

int foo(String userInput) {
    int i = Integer.parseInt(userInput);
    return i * 4;
}

这将抛出除非数字的字符串输入之外的其他内容。但你无法做任何事情,所以你让它传播。

这是另一个例子

class Communicator {

    private InputStream in;
    private OutputStream out;

    public Communicator(Socket socket) throws IOException {
        in = new ObjectInputStream(socket.getInputStream());
        out = new ObjectOutputStream(socket.getOutputStream());
    }

}

如果套接字抛出IOException,您是否可能期望恢复并使Communicator仍然有效?我想不是。放手吧,让它传播,让它找到能够处理它的人。

此外,您应该知道自己没有catch或声明throws 所有例外。如果它是RuntimeException,则您不需要。对于大多数部分,这些异常通常意味着错误(NullPointerException,任何人?)或错误的用户输入(NumberFormatException。)