我通过以下方式调用方法:
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!!!");
}
}
}
答案 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块中。