在所有行完成执行后处理异常,但没有最终执行

f1tvaqid  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(333)

我需要methoda2也被执行,即使methoda1()有一个异常。这里我只添加了两个方法,分别是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调用许多方法。在这种情况下,多次尝试,抓住,最后会看起来很难看。。那么还有其他的方法吗?
我需要在日志文件中存储错误信息。在methoda1()、methoda2()中。。。每个标签中的信息都得到验证。我想要的是在日志文件中有所有的错误信息。一旦异常抛出,它将生成日志文件。所以我会错过其他标签的验证信息。所以我们不能走到最后。

fhg3lkii

fhg3lkii1#

您可以在java 8 lambda中使用循环:

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

}

请注意,只有当方法抛出checked exception时才需要该接口。如果它们只抛出运行时异常,您可以使用 java.lang.Runnable 相反。

g6ll5ycj

g6ll5ycj2#

别无选择。如果每个方法都可以抛出异常,但是您仍然希望继续执行其余的方法,那么每个方法调用都必须在自己的方法中 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 你自己。

相关问题