Las recetas itertools.iter_except
encapsula esta idea de "llamar a una función varias veces hasta que se produce una excepción". Es similar a la respuesta aceptada, pero la receta da un iterador en su lugar.
De las recetas:
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
que sin duda puede poner en práctica este último código directamente. Para mayor comodidad, utilizo una biblioteca separada, more_itertools
, que implementa esta receta para nosotros (opcional).
Ejemplo:
import more_itertools as mit
list(mit.iter_except([0, 1, 2].pop, IndexError))
# [2, 1, 0]
Aquí el pop
método (o función dada) se llama para cada iteración del objeto de lista hasta que un IndexError
se eleva.
Para su caso, dada cierta connect_function
y error esperado, usted puede hacer un iterador que llama a la función repetidamente hasta que se produce una excepción, por ejemplo:
mit.iter_except(connect_function, ConnectionError)
En este punto, lo tratan como cualquier otro iterador al recorrerlo o llamar al next()
.
Err ... ¿Qué sucede cuando el servidor remoto muere? ¿Estará ahí consumiendo el 100% de un núcleo de CPU? – user9876
continuar debería estar en else e irrumpir excepto ¿Es un error tipográfico? –
@aand: No. Si se produce una excepción, que quiere intentarlo de nuevo (es decir: 'continue'), pero si no se produce ninguna excepción, que quiere que algunas cosas (esbozado por un comentario) y que salir de que el abuso de raro un bucle. ('Else' ejecuta si no se produce una excepción, que es la pieza que falta?) – delnan