Try-catch est destiné à aider à la gestion des exceptions. Cela signifie en quelque sorte que cela aidera notre système à être plus robuste: essayez de récupérer après un événement inattendu.
Nous soupçonnons que quelque chose pourrait se produire lors de l'exécution et de l'instruction (envoi d'un message), il est donc inclus dans l'essai. Si quelque chose de presque inattendu se produit, nous pouvons faire quelque chose: nous écrivons la capture. Je ne pense pas que nous ayons appelé pour simplement enregistrer l'exception. Je pense que le bloc catch est destiné à nous donner la possibilité de récupérer de l'erreur.
Supposons maintenant que nous nous remettions de l'erreur parce que nous pouvions corriger ce qui n'allait pas. Ça pourrait être super sympa de refaire un essai:
try{ some_instruction(); }
catch (NearlyUnexpectedException e){
fix_the_problem();
retry;
}
Cela tomberait rapidement dans la boucle éternelle, mais disons que le fix_the_problem renvoie true, puis nous réessayons. Étant donné qu'il n'y a rien de tel en Java, comment résoudriez-vous ce problème? Quel serait votre meilleur code de conception pour résoudre ce problème?
C'est comme une question philosophique, étant donné que je sais déjà que ce que je demande n'est pas directement pris en charge par Java.
la source
remove()
partir d'unjava.util.Queue
, qui va etInvalidElementException
quand la file d'attente est vide. Au lieu de demander s'il est vide, je contourne les actions dans un try-catch (qui, sous concurrence, devient obligatoire même avec le précédent if). Dans un tel cas, dans lecatch
bloc, je demanderais de remplir la file d'attente avec plus d'éléments, puis de réessayer. Voila.Réponses:
Vous devez enfermer votre
try-catch
intérieur dans unewhile
boucle comme celle-ci: -J'ai pris
count
etmaxTries
pour éviter de courir dans une boucle infinie, au cas où l'exception continue de se produire dans votretry block
.la source
maxTries
. Sinon, il s'exécuterainfinite loop
si un utilisateur donne continuellement une mauvaise entrée et ne sortira donc pas. Vous êtes bienvenu cependant. :)Solution "entreprise" obligatoire:
Et pour appeler:
la source
Comme d'habitude, la meilleure conception dépend des circonstances particulières. Habituellement cependant, j'écris quelque chose comme:
la source
continue
soit nécessaire là-bas .. Et vous pouvez simplement inverser la condition if.Bien que
try/catch
danswhile
est bien connu et une bonne stratégie que je veux vous suggérer appel récursif:la source
limit
la méthode récursive? Par opposition à la version en boucle, qui jettera au niveau 'original' ...void retry(int times) { (...) if (times==0) throw w; retry(times--);
Votre scénario exact géré via Failsafe :
Assez simple.
la source
Vous pouvez utiliser les annotations AOP et Java depuis jcabi-aspects (je suis développeur):
Vous pouvez également utiliser
@Loggable
et@LogException
annotations.la source
fix_the_problem();
dans le bloc catchLa plupart de ces réponses sont essentiellement les mêmes. Le mien l'est aussi, mais c'est la forme que j'aime
la source
fix_the_problem
après la dernière tentative. Cela pourrait être une opération coûteuse et pourrait perdre du temps.if (tryCount < max) fix()
- mais c'est le format d'une approche générale; les détails dépendraient d'un cas spécifique. Il y a aussi un Retryer à base de goyave que j'ai regardé.Spring AOP et solution basée sur les annotations:
Utilisation (
@RetryOperation
est notre annotation personnalisée pour le travail):Nous aurons besoin de deux choses pour y parvenir: 1. une interface d'annotation, et 2. un aspect ressort. Voici une façon de les implémenter:
L'interface d'annotation:
L'aspect printanier:
la source
Utilisez une
while
boucle avec lestatus
drapeau local . Initialisez l'indicateur asfalse
et réglez-letrue
lorsque l'opération réussit, par exemple ci-dessous:Cela continuera à réessayer jusqu'à son succès.
Si vous ne souhaitez réessayer qu'un certain nombre de fois, utilisez également un compteur:
Cela tentera au maximum 10 fois en cas d'échec jusqu'à ce qu'un se termine si c'est réussi avant la main.
la source
!success
votre temps, vous pouvez simplement vous évader lorsque le succès est vrai.success
n'importe où dans votrecatch
. Il semble donc superflu de le vérifier, à chaque exécution decatch
.success
. Essaye le.C'est une vieille question mais une solution est toujours d'actualité. Voici ma solution générique en Java 8 sans utiliser de bibliothèque tierce:
Ayons un cas de test comme:
la source
Un moyen simple de résoudre le problème serait d'enrouler le try / catch dans une boucle while et de maintenir un décompte. De cette façon, vous pouvez empêcher une boucle infinie en vérifiant un nombre par rapport à une autre variable tout en conservant un journal de vos échecs. Ce n'est pas la solution la plus exquise, mais cela fonctionnerait.
la source
Utilisez un do-while pour concevoir un bloc de réessai.
la source
Au cas où cela serait utile, quelques options supplémentaires à considérer, toutes regroupées (fichier d'arrêt au lieu de nouvelles tentatives, mise en veille, continuer la boucle plus grande), toutes éventuellement utiles.
la source
Vous pouvez utiliser https://github.com/bnsd55/RetryCatch
Exemple:
Au lieu de cela,
new ExampleRunnable()
vous pouvez transmettre votre propre fonction anonyme.la source
Si toutes les exceptions ne justifient pas une nouvelle tentative, seulement certaines. Et si au moins un essai doit être fait, voici une méthode utilitaire alternative:
Usage:
la source
Tout ce que fait Try-Catch est de permettre à votre programme d'échouer sans problème. Dans une instruction catch, vous essayez généralement de consigner l'erreur, et peut-être d'annuler les modifications si vous en avez besoin.
la source
(!finished)
?while(finished)
. Je préfère utiliser la version plus verbeuse.while(!finished)
ressemble la terrewhile (finished)
??IsPopulated()
qui revient juste!IsNullOrEmpty()
pour s'assurer que mon intention est comprise par tous les développeurs.Je sais qu'il y a déjà beaucoup de réponses similaires ici, et la mienne n'est pas très différente, mais je la publierai quand même car elle traite d'un cas / problème spécifique.
Lorsque vous traitez avec
facebook Graph API
in,PHP
vous obtenez parfois une erreur, mais réessayer immédiatement la même chose donnera un résultat positif (pour diverses raisons magiques sur Internet qui dépassent le cadre de cette question). Dans ce cas, il n'est pas nécessaire de corriger une erreur, mais simplement de réessayer car il y a eu une sorte d '"erreur facebook".Ce code est utilisé immédiatement après la création d'une session facebook:
De plus, en ayant le
for
compte à rebours à zéro ($attempt--
), il est assez facile de changer le nombre de tentatives à l'avenir.la source
voici ma solution avec une approche très simple!
la source
Je ne sais pas si c'est la façon "professionnelle" de le faire et je ne suis pas tout à fait sûr si cela fonctionne pour tout.
la source
https://github.com/tusharmndr/retry-function-wrapper/tree/master/src/main/java/io
la source
Voici une approche réutilisable et plus générique pour Java 8+ qui ne nécessite pas de bibliothèques externes:
Usage:
la source
Le problème avec les solutions restantes est que la fonction correspondante essaie en continu sans intervalle de temps, inondant ainsi la pile.
Pourquoi ne pas n'ingérer
try
que toutes les secondes et éternellement ?Voici une solution utilisant
setTimeout
et une fonction récursive:Remplacez la fonction
Run()
par la fonction ou le code que vous souhaitez voirtry
chaque seconde.la source
Essayez-le en utilisant l'annotation springs @Retryable, la méthode ci-dessous réessayera pendant 3 tentatives lorsque RuntimeException se produit
la source
Sous l'extrait, exécutez un extrait de code. Si vous obtenez une erreur lors de l'exécution de l'extrait de code, veillez pendant M millisecondes et réessayez. Lien de référence .
la source
Voici ma solution similaire à d'autres qui peuvent encapsuler une fonction, mais vous permet d'obtenir la valeur de retour des fonctions, si elle réussit.
la source