Das itertools.iter_exceptRezept fasst diese Idee zusammen, "eine Funktion wiederholt aufzurufen, bis eine Ausnahme ausgelöst wird". Es ähnelt der akzeptierten 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()
while True:
yield func()
except exception:
pass
Sie können den letzteren Code sicherlich direkt implementieren. Der Einfachheit halber verwende ich eine separate Bibliothek, more_itertoolsdie dieses Rezept für uns implementiert (optional).
Code
import more_itertools as mit
list(mit.iter_except([0, 1, 2].pop, IndexError))
Einzelheiten
Hier wird die popMethode (oder gegebene Funktion) für jede Iteration des Listenobjekts aufgerufen, bis ein IndexErrorausgelöst wird.
In Ihrem Fall können Sie bei einigen connect_functionund erwarteten Fehlern einen Iterator erstellen, der die Funktion wiederholt aufruft, bis eine Ausnahme ausgelöst wird, z
mit.iter_except(connect_function, ConnectionError)
Behandeln Sie es an dieser Stelle wie jeden anderen Iterator, indem Sie es durchlaufen oder aufrufen next().