#java
Вопрос:
У меня есть требование, согласно которому поток выполнения программы должен продолжаться даже после создания исключения.
for(DataSource source : dataSources) {
try {
//do something with 'source'
} catch (Exception e) {
}
}
Если на первой итерации возникает исключение, выполнение потока останавливается. Мое требование состоит в том, что даже после создания исключения для первой итерации другие итерации должны продолжаться.
Могу ли я записать логику в блок catch?
Комментарии:
1. Логика, которая у вас сейчас есть, делает именно это. Если исключение переходит
DataSource
в недопустимое состояние, при следующей попытке использования итератора может возникнуть другое исключение.
Ответ №1:
Ну, во-первых ,
Существует 2 типа исключений. Проверено и снято.
Непроверенные исключения-это те, от которых ваша программа не может восстановиться. Как указатели на нуль, говорящие вам, что что-то действительно не так с вашей логикой.
Проверенные исключения являются исключениями во время выполнения, и из них вы можете восстановиться.
Поэтому вам следует избегать использования элементов состояния catch, которые ищут базовый класс «Исключение». Которые представляют оба раза. Вероятно, вам следует подумать о поиске конкретных исключений(обычно подклассов исключений во время выполнения).
Короче говоря, в этом есть гораздо больше.
Вы также должны иметь в виду, что вы не должны использовать обработку исключений в качестве рабочего процесса. обычно это указывает на то, что ваша архитектура каким-то образом несовершенна. И, как указано в названии, они должны рассматриваться как «исключения» из обычного выполнения.
Теперь, учитывая ваш код :
for(DataSource source : dataSources) {
try {
//do something with 'source'
} catch (Exception e) { // catch any exception
continue; // will just skip this iteration and jump to the next
}
//other stuff ?
}
Как бы то ни было, он должен поймать исключение и двигаться дальше. Может быть, вы чего-то нам не договариваете ? 😛
В любом случае, надеюсь, это поможет.
Ответ №2:
Если вы каким-то образом не нарушаете цикл внутри блока catch, то другие итерации будут просто продолжаться, независимо от того, было ли исключение в предыдущей итерации.
Попробуйте этот простой пример и посмотрите, что произойдет:
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
for(String str: list) {
try {
System.out.println(str);
throw new Exception("Exception for string " str);
} catch(Exception ex) {
System.out.println("Caught exception");
}
}
Вы увидите, что все итерации выполняются, даже если каждая из них создает исключение.
Комментарии:
1. Привет, Тюдор, спасибо за твой ответ. я понял. мне также нужно разместить, наконец, блок, который будет вызван после всех итераций. его не следует вызывать для каждой итерации. как я могу этого достичь ? Пожалуйста, помогите мне!
2. @user1016403: В этом случае вам нужно будет обернуть весь цикл for в
try...finally
блок, например:try { for(...) { code } } finally { }
Ответ №3:
Если во for(DataSource source : dataSources)
время вызова dataSources
для инициализации итератора возникает исключение, то это исключение не будет перехвачено.
Это то, что вы подразумеваете под «Если на первой итерации возникает исключение, выполнение потока прекращается«?
Если это так, то вы больше ничего не можете сделать, и цикл не должен выполнять никаких взаимодействий.
Ответ №4:
Логика, которая у вас сейчас есть, делает именно это. Если исключение переходит DataSource
в недопустимое состояние, следующая попытка использования итератора может вызвать другое исключение, но это другой вопрос и что-то конкретное DataSource
(поэтому вам нужно будет посмотреть DataSource
, позволяет ли вам каким-либо образом справиться с этим другим недопустимым состоянием). Но в общем случае вы все делаете правильно.
Ответ №5:
Нет, нет языковой поддержки для обработки исключения и последующего перехода к оператору, который его вызвал. Вы должны обернуть отдельные try...catch
конструкции вокруг каждой подпоследовательности операций, которые должны выполняться, даже если предыдущая подпоследовательность вызвала исключение.
Комментарии:
1. «Нет, нет языковой поддержки для обработки исключения, а затем перехода к заявлению, которое его вызвало». Это не то, о чем спрашивали. Был задан вопрос о том, как разрешить продолжение других итераций.
2. ^ Верно. Я думаю, что он хотел бы что-то вроде: добавить a
finally
послеcatch
и продолжить итерацию там, где итерация потерпела крах. Хотя это может быть обходным путем, это не рекомендуется и довольно некрасиво.