一种确保上一条语句失败时执行语句的干净方法

时间:2018-10-19 17:29:07

标签: java exception data-structures exception-handling

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

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是否有更好的方法可以实现这一目标,或者是否有人知道可以帮助我的结构。

我的解决方案是为每个操作创建一个类,这样它就不会看起来那么脏,因为每一行都有那么多的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!!!");
        }
    }

}

3 个答案:

答案 0 :(得分:2)

您可以创建一个包含方法引用的列表,然后对其进行迭代并捕获引发的任何异常:

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

答案 1 :(得分:1)

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

一种更合理的方法是使用一个类,该类采用例如Callable对象的列表。该类将遍历这些对象并调用它们。您还可以提供一个“策略”对象,该对象定义在其中一个调用失败时如何做出反应。

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

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

答案 2 :(得分:0)

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