背景
我有一个案例,我的逻辑需要环绕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);
}
哪一个更好?
答案 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及更早版本,它取决于您选择的父异常。 Throwable
,Exception
和RuntimeException
等例外情况过于笼统。如果你发现这些,你最终可能会意外地捕获(然后错误处理)应该允许传播的异常。例如,您的代码会捕获NullPointerException
,您可能不会尝试从...那样恢复。
第一个版本比第二个版本更正确/更强大,即使它看起来很丑也更好。
当然,真正的答案取决于在您捕获并记录异常之后发生的事情。如果接下来发生的事情适用于所有例外,那么第二个版本(可以说)更可取。例如,捕获所有异常,记录它们然后调用System.exit(...)
。