Try-Catch soll bei der Ausnahmebehandlung helfen. Dies bedeutet irgendwie, dass unser System dadurch robuster wird: Versuchen Sie, sich von einem unerwarteten Ereignis zu erholen.
Wir vermuten, dass bei der Ausführung und Anweisung (Senden einer Nachricht) etwas passieren könnte, sodass es in den Versuch eingeschlossen wird. Wenn etwas fast Unerwartetes passiert, können wir etwas tun: Wir schreiben den Haken. Ich glaube nicht, dass wir angerufen haben, um nur die Ausnahme zu protokollieren. Ich denke, der Catch-Block soll uns die Möglichkeit geben, den Fehler zu beheben.
Nehmen wir jetzt an, wir beheben den Fehler, weil wir das Problem beheben konnten. Es könnte super schön sein, es noch einmal zu versuchen:
try{ some_instruction(); }
catch (NearlyUnexpectedException e){
fix_the_problem();
retry;
}
Dies würde schnell in die ewige Schleife fallen, aber sagen wir, dass das Problem fix_the_problem true zurückgibt, dann versuchen wir es erneut. Wie würden SIE dieses Problem lösen, da es so etwas in Java nicht gibt? Was wäre Ihr bester Designcode, um dieses Problem zu lösen?
Dies ist wie eine philosophische Frage, da ich bereits weiß, dass das, wonach ich frage, von Java nicht direkt unterstützt wird.
quelle
remove()
von einemjava.util.Queue
, der durchstößt undInvalidElementException
wenn die Warteschlange leer ist. Anstatt zu fragen, ob es leer ist, umrunde ich die Aktionen in einem Try-Catch (der unter Parallelität auch mit dem vorherigen if obligatorisch wird). In einem solchen Fallcatch
würde ich im Block darum bitten, die Warteschlange mit weiteren Elementen zu füllen und dann erneut zu versuchen. Voila.Antworten:
Sie müssen Ihr
try-catch
Inneres in einewhile
Schleife wie folgt einschließen : -Ich habe genommen
count
und ummaxTries
zu vermeiden, in eine Endlosschleife zu geraten, falls die Ausnahme in Ihrer weiterhin auftritttry block
.quelle
maxTries
. Andernfalls stößt es auf eine,infinite loop
wenn der Benutzer ständig falsche Eingaben macht, und wird daher nicht beendet. Gern geschehen. :)Obligatorische "Unternehmer" -Lösung:
Und um anzurufen:
quelle
Wie immer hängt das beste Design von den jeweiligen Umständen ab. Normalerweise schreibe ich aber so etwas wie:
quelle
continue
das dort gebraucht wird. Und Sie können einfach die if-Bedingung umdrehen.Obwohl
try/catch
inwhile
ist eine bekannte und gute Strategie, möchte ich Ihnen einen rekursiven Aufruf vorschlagen:quelle
limit
Fall vielleicht etwas seltsam aus, denn hätte er nicht die Anzahl der rekursiven Methoden? Im Gegensatz zur Loop-Version, die auf das "ursprüngliche" Niveau wirft ...void retry(int times) { (...) if (times==0) throw w; retry(times--);
Ihr genaues Szenario, das über Failsafe behandelt wird :
Ziemlich einfach.
quelle
Sie können AOP- und Java-Annotationen unter jcabi-Aspekten verwenden (ich bin Entwickler):
Sie können auch
@Loggable
und@LogException
Anmerkungen verwenden.quelle
fix_the_problem();
imDie meisten dieser Antworten sind im Wesentlichen gleich. Meins ist es auch, aber das ist die Form, die ich mag
quelle
fix_the_problem
nach dem letzten Versuch anrufen . Das könnte eine kostspielige Operation sein und einige Zeit verschwenden.if (tryCount < max) fix()
- aber dies ist das Format eines allgemeinen Ansatzes; Die Details würden von einem bestimmten Fall abhängen. Es gibt auch einen Guaven-basierten Retryer, den ich mir angesehen habe.Spring AOP- und annotationsbasierte Lösung:
Verwendung (
@RetryOperation
ist unsere benutzerdefinierte Anmerkung für den Job):Dazu benötigen wir zwei Dinge: 1. eine Anmerkungsschnittstelle und 2. einen Federaspekt. Hier ist eine Möglichkeit, diese zu implementieren:
Die Anmerkungsschnittstelle:
Der Frühlingsaspekt:
quelle
Verwenden Sie eine
while
Schleife mit lokalemstatus
Flag. Initialisieren Sie das Flag alsfalse
und setzen Sie es auf,true
wenn der Vorgang erfolgreich ist, z. B. unten:Dies wird so lange wiederholt, bis es erfolgreich ist.
Wenn Sie nur eine bestimmte Anzahl von Malen wiederholen möchten, verwenden Sie auch einen Zähler:
Dies wird maximal 10 Mal versucht, wenn es bis dahin nicht erfolgreich ist, und wird beendet, wenn es vorher erfolgreich ist.
quelle
!success
Ihrer Zeit zu suchen, können Sie einfach ausbrechen, wenn der Erfolg wahr ist.success
nirgendwo in Ihrem änderncatch
. Es scheint also überflüssig, bei jedem Durchlauf danach zu suchencatch
.success
. Versuch es.Dies ist eine alte Frage, aber eine Lösung ist immer noch relevant. Hier ist meine generische Lösung in Java 8 ohne Verwendung einer Bibliothek eines Drittanbieters:
Lassen Sie uns einen Testfall haben wie:
quelle
Eine einfache Möglichkeit, das Problem zu lösen, besteht darin, den Versuch / Fang in eine while-Schleife zu packen und eine Zählung aufrechtzuerhalten. Auf diese Weise können Sie eine Endlosschleife verhindern, indem Sie eine Anzahl mit einer anderen Variablen vergleichen und gleichzeitig ein Protokoll Ihrer Fehler führen. Es ist nicht die exquisiteste Lösung, aber es würde funktionieren.
quelle
Verwenden Sie ein Do-While, um einen Wiederholungsblock zu entwerfen.
quelle
Für den Fall, dass es nützlich ist, sind ein paar weitere Optionen in Betracht zu ziehen, die alle zusammengewürfelt sind (stopfile statt Wiederholungsversuche, Schlaf, größere Schleife fortsetzen).
quelle
Sie können https://github.com/bnsd55/RetryCatch verwenden
Beispiel:
Stattdessen
new ExampleRunnable()
können Sie Ihre eigene anonyme Funktion übergeben.quelle
Wenn nicht alle Ausnahmen einen erneuten Versuch rechtfertigen, nur einige. Und wenn mindestens ein Versuch unternommen werden muss, ist hier eine alternative Dienstprogrammmethode:
Verwendung:
quelle
Alles, was ein Try-Catch bewirkt, ist, dass Ihr Programm ordnungsgemäß fehlschlägt. In einer catch-Anweisung versuchen Sie im Allgemeinen, den Fehler zu protokollieren und gegebenenfalls Änderungen rückgängig zu machen.
quelle
(!finished)
?while(finished)
. Ich bevorzuge die ausführlichere Version.while(!finished)
auswhile (finished)
?IsPopulated()
die nur zurückgibt,!IsNullOrEmpty()
um sicherzustellen, dass meine Absicht von allen Entwicklern verstanden wird.Ich weiß, dass es hier bereits viele ähnliche Antworten gibt, und meine ist nicht viel anders, aber ich werde sie trotzdem veröffentlichen, weil sie sich mit einem bestimmten Fall / Problem befasst.
Wenn Sie sich mit dem
facebook Graph API
In beschäftigen, erhaltenPHP
Sie manchmal einen Fehler, aber wenn Sie das Gleiche sofort erneut versuchen, erhalten Sie ein positives Ergebnis (aus verschiedenen magischen Internetgründen, die über den Rahmen dieser Frage hinausgehen). In diesem Fall muss das Problem nicht behoben werden keinen Fehler , sondern es einfach erneut versuchen, da ein "Facebook-Fehler" aufgetreten ist.Dieser Code wird unmittelbar nach dem Erstellen einer Facebook-Sitzung verwendet:
Wenn die
for
Schleife auf Null ($attempt--
) heruntergezählt wird, ist es außerdem ziemlich einfach, die Anzahl der Versuche in der Zukunft zu ändern.quelle
Das Folgende ist meine Lösung mit einem sehr einfachen Ansatz!
quelle
Ich bin mir nicht sicher, ob dies der "professionelle" Weg ist, und ich bin mir nicht ganz sicher, ob es für alles funktioniert.
quelle
https://github.com/tusharmndr/retry-function-wrapper/tree/master/src/main/java/io
quelle
Hier ein wiederverwendbarer und allgemeinerer Ansatz für Java 8+, für den keine externen Bibliotheken erforderlich sind:
Verwendung:
quelle
Das Problem bei den verbleibenden Lösungen ist, dass die Korrespondenzfunktion kontinuierlich ohne ein Zeitintervall dazwischen versucht, wodurch der Stapel überflutet wird.
Warum nicht einfach
try
jede Sekunde und ad eternum ?Hier eine Lösung mit
setTimeout
und eine rekursive Funktion:Ersetzen Sie die Funktion
Run()
durch die Funktion oder den Code, die Sietry
jede Sekunde neu erstellen möchten .quelle
Probieren Sie es mit der Annotation springs @Retryable aus. Die folgende Methode versucht es erneut, wenn RuntimeException auftritt
quelle
Führen Sie unter dem Snippet ein Code-Snippet aus. Wenn beim Ausführen des Code-Snippets ein Fehler aufgetreten ist, warten Sie M Millisekunden und versuchen Sie es erneut. Referenz Link .
quelle
Hier ist meine Lösung, ähnlich wie einige andere, die eine Funktion umschließen kann, aber es Ihnen ermöglicht, den Rückgabewert der Funktionen zu erhalten, wenn dies erfolgreich ist.
quelle