Java: Как бы я написал блок try-catch-repeat? - PullRequest
15 голосов
/ 13 ноября 2009

Мне известен встречный подход к этому. Мне было интересно, есть ли хороший и компактный способ сделать это.

Ответы [ 4 ]

28 голосов
/ 13 ноября 2009

Легенда - ваш ответ может быть улучшен; потому что если вы потерпите неудачу numTries раз, вы проглотите исключение. Гораздо лучше:

while (true) {
  try {
    //
    break;
  } catch (Exception e ) {
    if (--numTries == 0) throw e;
  }
}
5 голосов
/ 13 ноября 2009

Я видел несколько подходов, но я использую следующее:

int numtries = 3;
while(numtries-- != 0)
   try {
        ...
        break;
   } catch(Exception e) {
        continue;
   }
}

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

РЕДАКТИРОВАТЬ: oxbow_lakes предложил лучший подход. Пожалуйста, взгляните на это ...

2 голосов
/ 13 ноября 2009

Если вы уже используете Spring, вы можете захотеть создать аспект для этого поведения, так как это сквозная задача, и все, что вам нужно создать, - это pointcut, который соответствует всем вашим методам, нуждающимся в функциональности. см http://static.springsource.org/spring/docs/2.5.x/reference/aop.html#aop-ataspectj-example

1 голос
/ 22 марта 2013

Попробуйте аспектно-ориентированное программирование и @RetryOnFailure аннотация из jcabi-аспекты :

@RetryOnFailure(attempts = 2, delay = 10, verbose = false)
public String load(URL url) {
  return url.openConnection().getContent();
}
...