Break a для l oop И также генерировать исключение, когда происходит указанное c условие - PullRequest
0 голосов
/ 10 февраля 2020

Таким образом, я перебираю список учетных записей и хочу разбить целое «для l oop» для всех учетных записей в списке, а также одновременно выдать исключение при возникновении определенного условия. :

 accounts.forEach(account -> {
     try {
         if (isSomethingHappens()) {
             String errorMsg = "bla bla, you can't do that cuz condition is happening";
             printError(errorMsg);
             throw new Exception(errorMsg); // AND I also, in addition to the exception, I wanna break the whole loop here
         }
         doA();
         doB();

     } catch (Exception e) {
         printError(e);
     }
}

У кого-нибудь есть какой-нибудь элегантный способ сделать это? Может быть, завернуть его, за исключением моего собственного, и в этом конкретном случае поймать только его? Есть ли хорошая и известная практика по моему требованию? Я ценю любую помощь и многое другое!

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Во-первых, в forEach у вас нет break функциональности, подобной традиционной for loop. так что, если вам нужно разбить на l oop, используйте традиционное for loop В Java лямбда-выражение может генерировать только исключение времени выполнения , поэтому вы можете сделать следующее: создать CustomeRuntimeException и обернуть forEach l oop в try catch блоке

 try {
    accounts.forEach(account -> {
       if (isSomethingHappens()) {
           throw new CustomeRuntimeException("bla bla, you can't do that cuz condition is happening");
        }
     }
 } catch (CustomeRuntimeException e) {
    printError(e);
 }
    doA();
    doB();
}

путём этого, если isSomethingHappens вернёт туру, который бросит CustomeRuntimeException и будет пойман блоком catch и doA() & doB() метод выполнится после catch

0 голосов
/ 10 февраля 2020

Один хороший способ сделать это - повторно поднять ошибку в вашем внутреннем catch блоке. Это передаст управление следующему внешнему try / catch. Итак, поместите другой блок try / catch вне вашей foreach конструкции.

  • Исключение возникает и перехватывается самым внутренним try.
  • Материал printError() готово.
  • Возобновлено исключение, в результате которого forEach.
  • try, окружающий forEach, перехватывает повторное исключение.
...