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

Java 在上一条语句失败时确保语句执行的干净方法,java,exception,data-structures,exception-handling,Java,Exception,Data Structures,Exception Handling,我以以下方式调用方法: operation1(); operation2(); operation3(); operation4(); operation5(); operation6(); 我需要的是,当一个句子失败时,执行下列句子。我计划按以下方式执行:使用基于抛出的异常类型的标签,每个操作都有一个异常类型 try { op1:operation1(); op2:operation2(); op3:operation3();

我以以下方式调用方法:

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

}

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

没有直接内置的解决方案

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

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


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

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

List<Runnable> methods = Arrays.asList(this::operation1, this::operation2 /* etc... */);
methods.forEach(r -> {
    try {
        r.run();
    } catch (Exception ignored) {
    }
});
List-methods=Arrays.asList(this::operation1、this::operation2/*等….*/);
方法:forEach(r->{
试一试{
r、 run();
}捕获(忽略异常){
}
});

您是否已经考虑过使用?这将是一个比使用异常和标签更好的设计。仅供参考,在Java中,除了在
开关
情况下,使用go-to模式(标签,在
中断后的方向)通常是不受欢迎的。这是一种失宠的编程风格的残余。参见,例如,建议的解决方案似乎有些复杂,我在等待一个更简单的答案,凭借我的一点经验,我希望找到一些模式或实用程序,帮助我使管理此部分的代码看起来不那么脏,一开始看起来很简单,我不知道如何正确地使用线程,我认为我不知道如何使用线程提出解决方案。我的解决方案是为每个操作创建一个类,每个类负责处理错误。是的,这就像把垃圾放在地毯下一样。这很简单,也很有效,但前提是java大于或等于1.8。