我在遗留项目中看到下面的代码,我正在捕获不同类型的异常,意图就是记录它们
try {
//somecode
}
catch (ProjectExceptionException1 e) {
log.error(e.getMessage(), e);
}
catch (ProjectExceptionException2 e) {
log.error(e.getMessage(), e);
}
catch (Exception e) {
log.error(e.getMessage(), e);
}
我的观点是,如果要求只是记录异常(无论是已选中还是未选中),上面的代码应由下面的代码替换 这使代码更简单,更易读。根据我的理解,没有必要捕捉特定的例外和做法 同样的东西。不是吗?如果我在这里遗漏了一些东西,请告诉我。
try {
//somecode
}
catch (Exception e) {
log.error(e.getMessage(), e);
}
UPDATE: - 即使在UI上抛出特定异常也只是为了显示如下所示的堆栈跟踪。即便如此,它也没有意义 。基本上,如果我们想以特殊的方式处理特定的异常,那么它就有意义了。正确?
try {
//somecode
}
catch (ProjectExceptionException1 e1) {
throw e1;
}
catch (ProjectExceptionException2 e2) {
throw e2;
}
catch (Exception e3) {
throw e3;
}
答案 0 :(得分:2)
是的,用单catch (Exception e)
替换顶部块是完全正常的,只要您只记录并且不需要任何Exception
特定处理。
答案 1 :(得分:0)
从Java 7开始,你可以catch
多个例外,并使用语法以相同的方式处理它们:
catch (ProjectExceptionException1 | ProjectExceptionException2 ex)
因此,如果您想记录一些异常但是对其他异常进行操作,则可以以这种方式对行为进行分组,假设您要执行的操作是相同的。例如打印堆栈跟踪然后记录ProjectExceptionException1
和ProjectExceptionException2
,但只记录其他所有内容。
答案 2 :(得分:0)
如果您可以将代码升级到java 1.7,则可以使用新的多捕获功能。它看起来像这样:
try {
//somecode
}
catch (ProjectExceptionException1 | ProjectExceptionException2 e) {
log.error(e.getMessage(), e);
}
您可能需要重新考虑捕获Exception,并且只捕获您知道将被try块中的代码抛出的异常,因此您不仅要求记录意外异常。 这是一个链接,通过示例详细介绍该功能:http://www.oracle.com/technetwork/articles/java/java7exceptions-486908.html