Aún otro ejemplo de try, except, else, finally / Yet another try, except, else, finally example


Estaba pasando datos de una DB mysql a otra en django y me ha salido este "snippet" que ejemplifica el uso de try-except-else-finally.

try contiene el código que queremos proteger
except captura la excepción (usar la clase genérica exception para capturarlas todas)
else código que se ejecutará si no salta ninguna excepción
finally código que se ejecutará en todo caso tanto si hay como si no hay excepción

Las únicas obligatorias son try y except. Si queremos capturar más de una excepción, las ponemos una detrás de otra:

from django.core.exceptions import ObjectDoesNotExist
try:
    cl=Cliente.objects.get(clave=id)
except ObjectDoesNotExist, ex:
    print "el cliente no existe"
except Exception, ex:
    print "se ha producido un error", str(ex)

Ejemplo:


try:
try:
c=db_marcajes.cursor(MySQLdb.cursors.DictCursor)
c.execute("select id, fecha, event, door, user from logs where fecha>%s", (last_marcaje,))
rows=c.fetchall()
except Exception, e:
print "Impossible efectuar consulta"
exit(1)
else:
elapsed = (time.clock() - start)
print "Consulta realitzada en", elapsed, "msegs"
num_rows=len(rows)
print "Numero de filas ", num_rows
i=0
while i<num_rows:
row=rows[i]
print "procesando fila ", repr(row)
try:
em=Empleado.objects.get(pin=row['user'])
pt=Puerta.objects.get(pk=row['door'])
print ("guardando acceso %s de %s" % (row['user'],em.descripcion,))
except Exception, ex:
print ("Error de busqueda empleado %s puerta %s: %s", ( row['user'], row['door'], ex, ))
else:
try:
acc=Acceso(
empleado=em,
es=row['event'],
fecha=row['fecha'],
puerta=pt,
)
#acc.save()
print "Guardado"
except Exception, ex:
print ("Error grabando acceso: %s" % (ex,))
finally:
i+=1
last_marcaje=row['fecha']
finally:
c.close()
finally:
# guardam darrer marcatje
conv=Convenio.objects.get(pk=1)
conv.last_marcaje=last_marcaje
conv.save()