Die itertools.iter_except
Rezepte kapselt diese Idee „eine Funktion wiederholt aufrufen, bis eine Ausnahme ausgelöst wird“. Es ist ähnlich wie die angenommene Antwort, aber das Rezept gibt stattdessen einen Iterator.
Aus den Rezepten:
def iter_except(func, exception, first=None):
""" Call a function repeatedly until an exception is raised."""
try:
if first is not None:
yield first() # For database APIs needing an initial cast to db.first()
while True:
yield func()
except exception:
pass
Sie können sicher die letztere Code direkt umzusetzen. Für die Bequemlichkeit verwende ich eine separate Bibliothek, more_itertools
, die dieses Rezept für uns implementiert (optional).
Beispiel:
import more_itertools as mit
list(mit.iter_except([0, 1, 2].pop, IndexError))
# [2, 1, 0]
Hier wird die pop
Methode (oder gegebene Funktion) für jede Iteration des Listenobjekt, bis ein IndexError
aufgerufen wird, wird erhöht.
Für Ihren Fall gegeben einig connect_function
und erwartete Fehler, können Sie einen Iterator machen, die die Funktion wiederholt aufrufen, bis eine Ausnahme ausgelöst wird, zB:
mit.iter_except(connect_function, ConnectionError)
An diesem Punkt behandeln sie wie jeden anderen Iterator indem Sie es überschleifen oder next()
anrufen.
Err ... was passiert, wenn der Remote-Server stirbt? Wird dies dort Platz nehmen und 100% eines CPU-Kerns verbrauchen? – user9876
Fortsetzung sollte in sonst sein und einbrechen außer. Ist es ein Tippfehler? –
@aand: Nein. Wenn eine Ausnahme auftritt, möchte er es erneut versuchen (lies: 'continue'), aber wenn keine Ausnahme auftritt, möchte er einige Dinge (skizziert durch einen Kommentar) und aus diesem seltsamen Missbrauch von eine Schleife. ('else' wird ausgeführt, wenn keine Ausnahme auftritt, ist das das fehlende Stück?) – delnan