Я предполагаю, что вы пытаетесь выполнить какую-то проверку элементов в списке, где об ошибках проверки сообщают, выдавая исключения. Я также предполагаю, что вы пытаетесь собрать всех ошибок проверки.
Простой ответ заключается в том, что эту проблему невозможно решить с помощью этого подхода. Чтобы понять почему, взгляните на это:
boolean exceptionCaught = false;
do {
try {
item.doSomething();
} catch (MyException e) {
exceptionCaught = true;
}
} while (exceptionCaught);
Это терпит неудачу, потому что каждый раз, когда вы звоните item.doSomething()
, оно будет выдавать исключение в одном и том же месте. Конечным результатом является бесконечный цикл.
Лучшее, что вы можете сделать с этим подходом, - захватить первое исключение для каждого item
в списке.
Так как же вы можете достичь того, чего пытаетесь достичь? Ответ заключается в том, что вы должны изменить код проверки, чтобы использовать какой-либо другой способ сообщения об ошибках, кроме выдачи исключений. Например, вы можете изменить:
class Item {
...
void validate() {
if (noHat) {
throw new MyException("bad hat");
}
if (noPants) {
throw new MyException("world-wide pants");
}
}
}
примерно так:
class Item {
...
void isValid(List<MyException> errors) {
boolean ok = true;
if (noHat) {
errors.add(new MyException("bad hat"));
ok = false;
}
if (noPants) {
errors.add(new MyException("world-wide pants"));
ok = false;
}
return ok;
}
}
Грязно, да! Вы можете воспринимать это по-разному, но такой стиль отчетов об ошибках всегда будет более сложным. Но я не думаю, что есть практический способ избежать беспорядка И захвата ВСЕХ ошибок проверки.