4

背景
我有一个案例,我的逻辑需要用 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);
} 

哪一个更好?

4

2 回答 2

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

于 2013-09-13T01:11:27.330 回答
1

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

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


对于 Java 6 及更早版本,这取决于您选择的父异常。和之类Throwable的例外情况太笼统了。如果你抓住了这些,你最终可能会意外地抓住(然后处理不当)你应该允许传播的异常。例如,您的代码会 发现您可能不应该尝试从...中恢复。ExceptionRuntimeExceptionNullPointerException

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


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

于 2013-09-13T01:59:47.883 回答