分别捕捉不同的例外有什么好处吗?

时间:2012-02-13 12:35:55

标签: java exception exception-handling

除了以不同方式处理不同异常的明显情况之外,单独处理异常是否有任何好处?我看到很多代码看起来像以下几行:

try {
    doSomethingThatMayThrowExceptions();
} catch (SomeException e) {
} catch (OtherException e) {
}

当我只有一个异常处理过程时,我总是倾向于捕获通用Exception

派生的问题是:如果它只是一个,它是否更好地陈述您正在捕获的确切类型的异常?例如:

try {
    number = Integer.parseInt(numberString);
} catch (Exception e) {
    // ...
}

在上面的示例中,try块只能抛出NumberFormatException。在这里捕获通用Exception是否有任何缺点?

4 个答案:

答案 0 :(得分:5)

  

在上面的例子中,try块只能抛出NumberFormatException。在这里捕获通用异常是否有任何缺点?

不是真的。但是可以问一下,“隐藏”确切的例外是什么?

如果你抓住NumberFormatException,你可以立即看到预期会抛出哪些异常。

编辑:请原谅我。上面的例子也可以抛出未经检查的异常,即。 NPE,所以你实际上捕获更多异常并以同样的方式对待它们。实际上,您可能希望为这些异常实现不同的异常处理(如果您甚至想要捕获和处理未经检查的异常)。

答案 1 :(得分:3)

捕获异常将导致捕获未经检查的异常以及已检查的异常,可能是您不期望的异常。这可能导致您的异常处理尝试以您想要的方式管理情境。

答案 2 :(得分:1)

对我而言,这是一个维护的事实,如果你在一年前写了一个应用程序,并且生成了一个异常并且你看了代码,那么很难看到throws Exception / } catch (Exception e) {,然后我需要读取方法中代码的所有javadoc,以查看抛出的异常类型。

所以我倾向于捕捉特定类型的异常以了解我正在处理的内容。 另一个例子可能是SQLException。在某些情况下;取决于sqle的errorCode,我想重试数据库操作,而在任何其他类型的异常中我想中止并报告。

答案 3 :(得分:0)

不,它确实归结为只是为了让你有不同可能的意外情况的捕获条件。作为一般规则,仅捕获Exception是不好的,因为某些操作可能会导致您需要捕获IOException和SQLException,每个操作都需要非常不同的错误处理。

在大多数情况下,您实际上需要一个用于Exception的catch块,以便您拥有一个通用错误处理程序,您可以在其中清理并引发一般程序错误。虽然这应该在try-catch-block中的特定情况之后出现。