Tengo muchas líneas en una fila que pueden arrojar una excepción, pero no importa qué, todavía debe continuar la siguiente línea. ¿Cómo hacer esto sin intentar individualmente capturar cada afirmación que pueda arrojar una excepción?¿Cómo evitar intentar atrapar todas las líneas posibles en Python?
try:
this_may_cause_an_exception()
but_I_still_wanna_run_this()
and_this()
and_also_this()
except Exception, e:
logging.exception('An error maybe occured in one of first occuring functions causing the others not to be executed. Locals: {locals}'.format(locals=locals()))
Veamos el código anterior, todas las funciones pueden lanzar excepciones, pero todavía debe ejecutar las siguientes funciones no importa si se produjo una excepción o no. ¿Hay una buena manera de hacer eso?
No quiero hacer esto:
try:
this_may_cause_an_exception()
except:
pass
try:
but_I_still_wanna_run_this()
except:
pass
try:
and_this()
except:
pass
try:
and_also_this()
except:
pass
Creo código todavía debe continuar ejecutándose después de una excepción sólo si la excepción es crítica (El equipo se quemará o todo el sistema será llegar en mal estado, se debe detener todo el programa, pero para muchas cosas pequeñas también se lanzan excepciones como conexión fallida, etc.) Normalmente no tengo ningún problema con el manejo de excepciones, pero en este caso estoy usando una biblioteca de terceros que arroja fácilmente excepciones para cosas pequeñas
Después de ver la respuesta de m4spy, pensé que no sería posible, tener un decorador que permita que cada línea en la función se ejecute aunque una de ellas presente una excepción.
Algo como esto sería genial:
def silent_log_exceptions(func):
@wraps(func)
def _wrapper(*args, **kwargs):
try:
func(*args, **kwargs)
except Exception:
logging.exception('...')
some_special_python_keyword # which causes it to continue executing the next line
return _wrapper
O algo así:
def silent_log_exceptions(func):
@wraps(func)
def _wrapper(*args, **kwargs):
for line in func(*args, **kwargs):
try:
exec line
except Exception:
logging.exception('...')
return _wrapper
@silent_log_exceptions
def save_tweets():
a = requests.get('http://twitter.com)
x = parse(a)
bla = x * x
Ninguno de estos estilos de codificación de sentirse terriblemente Pythonic ... No estoy realmente seguro de lo que sugieren, pero espero con interés la respuesta. – Crisfole