在所有行完成执行后处理异常而不是最终

时间:2017-01-03 16:50:07

标签: java exception-handling

即使methodA1()存在异常,我也需要执行methodA2。这里我只添加了两个方法,如methodA1()和methodA2()。让我们说有很多方法。在这种情况下,解决方案也应该适用。

        class A {
             String methodA1() throws ExceptionE {
                // do something
            }

            String methodA2() throws ExceptionE {
                 // do something
            }
        }

        class C extends A {
                String methodC() throws ExceptionE2 {
                try {
                    methodA1();
                    methodA2();
                } catch (ExceptionE e) {
                     throw new ExceptionE2();
                }
            }
        }

请注意,methodA1,methodA2可以调用许多方法。在那种情况下有多次尝试,catch,最后会看起来很难看。那么有没有其他方法可以做到这一点?

我需要将错误信息存储在日志文件中。在methodA1()中,方法A2()...每个标记中的信息都得到验证。我想要的是在日志文件中包含所有错误信息。一旦异常抛出,它将生成日志文件。所以我会错过其他标签的验证信息。所以我们不能最终接近。

2 个答案:

答案 0 :(得分:0)

别无他法。如果每个方法都可以抛出异常,但是你想继续执行剩余的方法,那么每个方法调用必须在它自己的try-catch块中。

示例:

List<Exception> exceptions = new ArrayList<>();
try {
    methodA1();
} catch (Exception e) {
    exceptions.add(e);
}
try {
    methodA2();
} catch (Exception e) {
    exceptions.add(e);
}
try {
    methodA3();
} catch (Exception e) {
    exceptions.add(e);
}
if (! exceptions.isEmpty()) {
    if (exceptions.size() == 1)
        throw exceptions.get(0);
    throw new CompoundException(exceptions);
}

您当然必须自己实施CompoundException

答案 1 :(得分:0)

您可以在Java 8 lambdas中使用循环:

interface RunnableE {
    void run() throws Exception;
}

class Example {

    public static void main(String[] args) {
        List<RunnableE> methods = Arrays.asList(
                () -> methodA1(),
                () -> methodA2(),
                () -> methodA3()
        );

        for (RunnableE method : methods) {
            try {
                method.run();
            } catch (Exception e) {
                // log the exception
            }
        }
    }

    private static void methodA1() throws Exception {
        System.out.println("A1");
    }

    private static void methodA2() throws Exception {
        System.out.println("A2");
    }

    private static void methodA3() throws Exception {
        System.out.println("A3");
    }

}

请注意,仅当方法抛出检查异常时才需要该接口。如果他们只抛出运行时异常,则可以使用java.lang.Runnable代替。