前一条语句失败时确保语句执行的简洁方法

Clean way to ensure statement execution when the previous statement fails

我通过以下方式调用方法:

operation1();
operation2();
operation3();
operation4();
operation5();
operation6();

我需要当一个句子失败时,执行下面的句子。我打算按以下方式进行:根据抛出的异常类型进行标记,每个操作都有一个异常类型。

    try {

        op1:operation1();
        op2:operation2();
        op3:operation3();
        op4:operation4();
        op5:operation5();
        op6:operation6();

        } catch (Operation1Exeption e) {
            break op2;
        } catch (Operation2Exeption e){
            break op3;
        } catch (Operation3Exception e){
          ...
        }

但这并不能说服我,我想知道java是否有更好的方法来实现这个,或者是否知道一些可以帮助我的结构。

我的解决方案是为每个操作创建一个class,这样它就不会看起来那么脏,每行都有那么多try-catch,所以句子块看起来像这样:

Operation1.doWork();
Operation2.doWork();
Operation3.doWork();
Operation4.doWork();

每个操作都在服务方法中处理其错误,因此如果一个操作抛出异常,它将在服务方法中处理,并且无论上一个操作的结果如何,都会执行下一个操作。

public class Operation1 {

    public void doWork() {
        try {
            System.out.println("Operation1 work done!!!");
        } catch (Exception e) {
            System.err.println("Operation 1 fail!!!");
        }
    }

}

即使发生异常也执行下一个方法。每个方法都可以放在单独的 try catch 块中。

没有直接的内置解决方案。

更合理的方法是使用 class,它以 Callable 对象列表为例。 class 遍历这些对象并调用它们。您还可以提供一个 "policy" 对象来定义其中一个调用失败时如何反应。

硬编码,就像在您的示例中一样,是一个非常不灵活的实现。这对于原型来说很好,但如果您必须为真正的产品维护它,我建议您考虑创建这样一个框架。

一个简单的解决方案是使用单线程 ExecutorService。只需将每个调用作为任务提交到该服务中。

您可以创建一个包含方法引用的列表,然后遍历它们并捕获抛出的任何异常:

List<Runnable> methods = Arrays.asList(this::operation1, this::operation2 /* etc... */);
methods.forEach(r -> {
    try {
        r.run();
    } catch (Exception ignored) {
    }
});