详细的异常捕获子句

时间:2013-09-13 01:08:13

标签: java exception exception-handling

背景
我有一个案例,我的逻辑需要环绕try / catch,我有很多catch子句,这使我的代码有点难看。我在catch子句中所做的只是使用log4j记录错误 的问题 是否可以使用一个带有父异常类型的catch子句而不是一堆catch子句? 而不是:

try{
        //some statements
} catch (KeyStoreException e) {
    LOGGER.error(e);
} catch (CertificateException e) {
    LOGGER.error(e);
} catch (NoSuchAlgorithmException e) {
    LOGGER.error(e);
} catch (FileNotFoundException e) {
    LOGGER.error(e);
} catch (IOException e) {
    LOGGER.error(e);
} catch (UnrecoverableKeyException e) {
    LOGGER.error(e);
} catch (NoPropertyFoundException e) {
    LOGGER.error(e);
}

使用:

try{

    //some statements
} catch (Exception e) {
    LOGGER.error(e);
} 

哪一个更好?

2 个答案:

答案 0 :(得分:3)

当捕获异常时,我通常会发现更具体的更好,就是说输入所有那些做同样事情的不同块可能会变得非常烦人。值得庆幸的是,在Java 7发行版中添加了try-catch表示法,您可以在其中为单个块指定特定的多个例外:

try{
        //some statements
} catch (KeyStoreException         |
         CertificateException      |
         NoSuchAlgorithmException  |
         FileNotFoundException     |
         IOException               |
         UnrecoverableKeyException |
         NoPropertyFoundException e) {
    LOGGER.error(e);
}

这听起来像您正在寻找的,但Oracle文档中有更详细的信息:http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html

答案 1 :(得分:1)

  

是否可以使用一个带有父异常类型的catch子句而不是一堆catch子句?

Hunter为Java 7及更高版本提供了正确的解决方案。


对于Java 6及更早版本,它取决于您选择的父异常。 ThrowableExceptionRuntimeException等例外情况过于笼统。如果你发现这些,你最终可能会意外地捕获(然后错误处理)应该允许传播的异常。例如,您的代码会捕获NullPointerException,您可能不会尝试从...那样恢复。

第一个版本比第二个版本更正确/更强大,即使它看起来很丑也更好。


当然,真正的答案取决于在您捕获并记录异常之后发生的事情。如果接下来发生的事情适用于所有例外,那么第二个版本(可以说)更可取。例如,捕获所有异常,记录它们然后调用System.exit(...)

可能是适当的