Try-catch призван помочь в обработке исключений. Это как-то означает, что это поможет нашей системе быть более устойчивой: попытаться восстановиться после неожиданного события.
Мы подозреваем, что что-то может произойти при выполнении команды и инструкции (отправке сообщения), поэтому оно включается в попытку. Если случается что-то почти неожиданное, мы можем что-то сделать: мы пишем улов. Я не думаю, что мы позвонили, чтобы просто зарегистрировать исключение. Мне кажется, что блок catch предназначен для того, чтобы дать нам возможность восстановления после ошибки.
Теперь, допустим, мы оправились от ошибки, потому что мы могли исправить то, что было не так. Это может быть супер приятно повторить попытку:
try{ some_instruction(); }
catch (NearlyUnexpectedException e){
fix_the_problem();
retry;
}
Это быстро попадет в вечный цикл, но допустим, что fix_the_problem возвращает true, а затем мы повторяем попытку. Учитывая, что в Java такого нет, как бы ВЫ решили эту проблему? Какой ваш лучший дизайнерский код для решения этой проблемы?
Это похоже на философский вопрос, учитывая, что я уже знаю, что то, что я спрашиваю, напрямую не поддерживается Java.
источник
remove()
из тогоjava.util.Queue
, что теряет иInvalidElementException
когда очередь пуста. Вместо того, чтобы спрашивать, пусто ли оно, я перебираю действия в try-catch (что при параллельности становится обязательным даже при предыдущем if). В таком случае вcatch
блоке я бы попросил пополнить очередь большим количеством элементов, а затем повторить попытку. Вуаля.Ответы:
Вы должны заключить свой цикл
try-catch
внутри,while
как это: -Я взял
count
и,maxTries
чтобы избежать запутывания в бесконечном цикле, на случай, если в вашем случае произойдет исключениеtry block
.источник
maxTries
. Вinfinite loop
противном случае он столкнется с тем, что пользователь постоянно вводит неверные данные, и, следовательно, не будет выходить. Пожалуйста, хотя. :)Обязательное «предпринимательское» решение:
И позвонить:
источник
Как обычно, лучший дизайн зависит от конкретных обстоятельств. Обычно, однако, я пишу что-то вроде:
источник
continue
там нужно .. И вы можете просто перевернуть условие if.Хотя
try/catch
вwhile
хорошо известный и хорошей стратегии я хочу предложить вам рекурсивный вызов:источник
limit
счет метода, который рекурсируется? В отличие от петлевой версии, которая выкинет на «оригинальный» уровень ...void retry(int times) { (...) if (times==0) throw w; retry(times--);
Точный сценарий обрабатывается через Failsafe :
Довольно просто
источник
Вы можете использовать аннотации AOP и Java из аспектов jcabi (я разработчик):
Вы также можете использовать
@Loggable
и@LogException
аннотации.источник
fix_the_problem();
в блоке пойматьБольшинство из этих ответов по сути одинаковы. Мой тоже, но эта форма мне нравится
источник
fix_the_problem
после последней попытки. Это может быть дорогостоящей операцией и потратить некоторое время.if (tryCount < max) fix()
- но это формат общего подхода; детали будут зависеть от конкретного случая. Есть также ретрилер на основе гуавы, на который я смотрел.Spring AOP и решение на основе аннотаций:
Использование (
@RetryOperation
это наша пользовательская аннотация для работы):Для этого нам понадобятся две вещи: 1. интерфейс аннотации и 2. аспект весны. Вот один из способов их реализации:
Интерфейс аннотации:
Весенний аспект:
источник
Используйте
while
цикл с локальнымstatus
флагом. Инициализируйте флаг какfalse
и установите его,true
когда операция прошла успешно, например, ниже:Это будет повторять попытки до его успешного завершения.
Если вы хотите повторить только определенное количество раз, используйте также счетчик:
Если попытка будет неудачной, то попытка будет предпринята максимум 10 раз, после чего она завершится успешно.
источник
!success
время, вы можете просто выйти, когда успех верен.success
в вашемcatch
. Таким образом, это кажется излишним, чтобы проверить это, при каждом запускеcatch
.success
. Попробуйте это.Это старый вопрос, но решение по-прежнему актуально. Вот мое общее решение в Java 8 без использования сторонней библиотеки:
Давайте иметь тестовый пример, как:
источник
Простой способ решить эту проблему - заключить цикл try / catch в цикл while и сохранить счетчик. Таким образом, вы можете предотвратить бесконечный цикл, сверяя счет с какой-либо другой переменной, сохраняя журнал ваших сбоев. Это не самое изысканное решение, но оно бы сработало.
источник
Используйте do-while для разработки повторной попытки блока.
источник
В случае, если это полезно, нужно рассмотреть еще пару вариантов, все вместе (стоп-файл вместо повторов, сон, продолжение большего цикла) - все это может быть полезно.
источник
Вы можете использовать https://github.com/bnsd55/RetryCatch
Пример:
Вместо этого
new ExampleRunnable()
вы можете передать свою собственную анонимную функцию.источник
Если не все исключения требуют повторной попытки, только некоторые. И если хотя бы одна попытка должна быть сделана, вот альтернативный вспомогательный метод:
Использование:
источник
Все, что делает Try-Catch, это позволяет вашей программе корректно завершиться с ошибкой. В операторе catch вы обычно пытаетесь зарегистрировать ошибку и, если нужно, откатить изменения.
источник
(!finished)
?while(finished)
. Я предпочитаю использовать более подробную версию.while(!finished)
выглядитwhile (finished)
??IsPopulated()
который просто возвращает,!IsNullOrEmpty()
чтобы убедиться, что мои намерения понятны всем разработчикам.Я знаю, что здесь уже есть много похожих ответов, и мой не сильно отличается, но я все равно опубликую его, потому что он касается конкретного случая / проблемы.
При работе с
facebook Graph API
inPHP
иногда вы получаете сообщение об ошибке, но немедленное повторение одной и той же вещи даст положительный результат (по различным магическим причинам Интернета, которые выходят за рамки этого вопроса). В этом случае нет необходимости исправлять какую-либо ошибку, нужно просто повторить попытку, потому что произошла какая-то «ошибка на Facebook».Этот код используется сразу после создания сессии в Facebook:
Кроме того, благодаря
for
уменьшению цикла до нуля ($attempt--
) это позволяет довольно легко изменить количество попыток в будущем.источник
Следующее - мое решение с очень простым подходом!
источник
Я не уверен, что это «профессиональный» способ сделать это, и я не совсем уверен, работает ли он на все.
источник
https://github.com/tusharmndr/retry-function-wrapper/tree/master/src/main/java/io
источник
Здесь повторно используемый и более общий подход для Java 8+, который не требует внешних библиотек:
Использование:
источник
Проблема с остальными решениями заключается в том, что соответствующая функция пытается непрерывно, без промежутка времени, таким образом, переполняя стек.
Почему бы не использовать
try
только каждую секунду и ad eternum ?Вот решение с использованием
setTimeout
и рекурсивной функции:Замените функцию
Run()
на функцию или код, который вы хотите использоватьtry
каждую секунду.источник
Попробуйте использовать аннотацию springs @Retryable, приведенный ниже метод будет повторять попытки 3 раза при возникновении исключения RuntimeException
источник
Ниже приведен фрагмент кода. Если во время выполнения фрагмента кода вы получили какую-либо ошибку, спите в течение M миллисекунд и повторите попытку. Ссылочная ссылка .
источник
Вот мое решение, подобное тому, что некоторые другие могут обернуть функцию, но позволяет вам получить возвращаемое значение функции, если оно выполнено успешно.
источник