Выполнить все операторы в пределах try / catch - PullRequest
0 голосов
/ 18 июня 2019

У меня есть куча похожих операторов в блоке try, и я хочу, чтобы все они выполнялись, даже если некоторые из них терпят неудачу. Это будет выглядеть примерно так:

try {
   doThing1();
   doThing2();
   doThing3();
   doThing4();
} catch (Exception e) {
   System.out.println(e.getMessage());
}

Однако, если, например, doThings2() завершится неудачно, 3 и 4 не будут выполнены. Как я могу заставить их всех выполнить? Я бы не стал помещать каждый из них в отдельный блок try / catch.

Ответы [ 2 ]

4 голосов
/ 18 июня 2019

Вы можете написать функцию, которая выполняет набор вызовов и которая не останавливается, даже если выдается исключение:

public void doThing(Runnable... invocations){
      for (Runnable invocation : invocations){
         try{
                invocation.run()
           }
           catch (Exception e) {
              System.out.println(e.getMessage());
           }
       } 
} 

И использовать ее таким образом, если методы расположены в одном и том жекласс:

doThing( this::doThing1, this::doThing2, this::doThing3, this::doThing4);

В противном случае перед оператором добавьте правильный класс / экземпляр:

doThing( () -> foo.doThing1(),  () -> foo.doThing2(),  () -> foo.doThing3(),  () -> foo.doThing4());
0 голосов
/ 18 июня 2019

Поскольку каждый из методов может вызвать исключение, в то время как другие завершены, мы можем предположить, что они не приводят к побочным эффектам. В этом случае мы можем просто запустить и забыть их, не думая о побочных эффектах.

ExecutionService service = Executors.newFixedThreadPool();

service.submit(()->doThing1())
service.submit(()->doThing2())
service.submit(()->doThing3())
service.submit(()->doThing4())
...