Ich habe eine Schleife beginnend mit for i in range(0, 100)
. Normalerweise läuft es korrekt, aber manchmal schlägt es aufgrund von Netzwerkbedingungen fehl. Derzeit habe ich es so eingestellt, dass es bei einem Fehler continue
in der Ausnahmeklausel angezeigt wird (weiter mit der nächsten Nummer für i
).
Kann ich die gleiche Nummer neu zuweisen i
und die fehlgeschlagene Iteration der Schleife erneut durchlaufen?
python
loops
exception
try-except
FurtiveFelon
quelle
quelle
range(100)
ohne den ersten Parameter verwenden. Wenn Sie Python 2.x verwenden, das Sie sogar verwenden könntenxrange(100)
, wird ein Iterator generiert und weniger Speicher benötigt. (Nicht, dass es bei nur 100 Objekten wichtig wäre.)Antworten:
Führen Sie eine
while True
for-Schleife durch, fügen Sie Ihrentry
Code ein und brechen Sie diesewhile
Schleife erst ab, wenn Ihr Code erfolgreich ist.quelle
continue
wiederholt diewhile
Schleife natürlich nicht diefor
(!),i
ist also nichts "das nächste" - es ist genau das gleiche wie auf einem vorherigen (fehlgeschlagenen) Abschnitt desselbenwhile
.Ich ziehe es vor, die Anzahl der Wiederholungsversuche zu begrenzen, damit Sie, wenn es ein Problem mit diesem bestimmten Element gibt, schließlich mit dem nächsten fortfahren, also:
quelle
else:
Klausel vonfor
.else
Klausel vontry
macht dies "Wenn erfolgreich, dann brechen", die Sie suchen.except
Das Wiederholungspaket ist eine gute Möglichkeit, einen Codeblock bei einem Fehler erneut zu versuchen .
Beispielsweise:
quelle
Hier ist eine ähnliche Lösung wie bei anderen, die jedoch die Ausnahme auslöst, wenn die vorgeschriebene Anzahl nicht erreicht wird oder es erneut versucht wird.
quelle
retries
ist irreführend. Es sollte viel lieber seintries
.Der "funktionalere" Ansatz, ohne diese hässlichen while-Schleifen zu verwenden:
quelle
except: tryAgain(retries+1)
Der klarste Weg wäre, explizit festzulegen
i
. Beispielsweise:quelle
i += 1
kurz danach setzen# do stuff
.range
für diese Art von Sachen verwenden.Eine generische Lösung mit Timeout:
Verwendung:
quelle
except exception:
try … except
Sie eineif
Anweisung verwenden. Aber es ist weniger pythonisch.callback
Funktion wird nie aufgerufen. Ich habe die Klammer vergessen, durch ersetzencallback()
.Meine Version ähnelt mehreren der oben genannten, verwendet jedoch keine separate
while
Schleife und löst die neueste Ausnahme erneut aus, wenn alle Wiederholungsversuche fehlschlagen. Könnte expliziterr = None
oben gesetzt werden, ist aber nicht unbedingt erforderlich, da es den letztenelse
Block nur ausführen sollte, wenn ein Fehler aufgetretenerr
ist und daher gesetzt ist.quelle
In der Python Decorator-Bibliothek gibt es etwas Ähnliches .
Bitte beachten Sie, dass nicht auf Ausnahmen geprüft wird, sondern auf den Rückgabewert. Es wird wiederholt, bis die dekorierte Funktion True zurückgibt.
Eine leicht modifizierte Version sollte den Trick machen.
quelle
Verwenden von while und einem Zähler:
quelle
Rekursion verwenden
quelle
Sie können das Python-Wiederholungspaket verwenden. Wiederholen
Es wurde in Python geschrieben, um das Hinzufügen von Wiederholungsverhalten zu nahezu allem zu vereinfachen.
quelle
Alternativen zu
retrying
:tenacity
undbackoff
(Update 2020)Die Wiederholungsbibliothek war früher der richtige Weg, hat aber leider einige Fehler und seit 2016 keine Updates mehr. Andere Alternativen scheinen Backoff und Hartnäckigkeit zu sein . Während des Schreibens hatte die Zähigkeit mehr GItHub-Sterne (2,3k gegenüber 1,2k) und wurde kürzlich aktualisiert, daher habe ich mich für die Verwendung entschieden. Hier ist ein Beispiel:
Der obige Code gibt ungefähr Folgendes aus:
Weitere Einstellungen für
tenacity.retry
finden Sie auf der Seite mit der Hartnäckigkeit von GitHub .quelle
Wenn Sie eine Lösung ohne verschachtelte Schleifen und
break
mit Erfolg aufrufen möchten, können Sie einen schnellen Wrapretriable
für jedes iterable entwickeln. Hier ist ein Beispiel für ein Netzwerkproblem, auf das ich häufig stoße: Die gespeicherte Authentifizierung läuft ab. Die Verwendung würde so lauten:quelle
Ich benutze folgendes in meinen Codes,
quelle
quelle
Hier ist meine Meinung zu diesem Thema. Die folgende
retry
Funktion unterstützt die folgenden Funktionen:Verwendung:
Siehe meinen Beitrag für weitere Informationen.
quelle
Hier ist meine Idee, wie man das behebt:
quelle
Ich habe kürzlich mit meinem Python an einer Lösung für dieses Problem gearbeitet und teile sie gerne mit Stackoverflow-Besuchern. Bitte geben Sie Feedback, wenn dies erforderlich ist.
quelle
Erhöhen Sie Ihre Schleifenvariable nur, wenn die try-Klausel erfolgreich ist
quelle