捕获特定的异常并在所有异常下做同样的事情?

时间:2014-04-09 04:44:41

标签: java exception

我在遗留项目中看到下面的代码,我正在捕获不同类型的异常,意图就是记录它们

        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;
            }

3 个答案:

答案 0 :(得分:2)

是的,用单catch (Exception e)替换顶部块是完全正常的,只要您只记录并且不需要任何Exception特定处理。

答案 1 :(得分:0)

Java 7开始,你可以catch多个例外,并使用语法以相同的方式处理它们:

catch (ProjectExceptionException1 | ProjectExceptionException2 ex)

因此,如果您想记录一些异常但是对其他异常进行操作,则可以以这种方式对行为进行分组,假设您要执行的操作是相同的。例如打印堆栈跟踪然后记录ProjectExceptionException1ProjectExceptionException2,但只记录其他所有内容。

答案 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