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。