2.25. Manejo de errores¶
La mayoría de los problemas en tiempo de ejecución en Python aparecen como excepciones – una forma nombrada y estructurada de informar de que algo salió mal. ValueError, TypeError, KeyError, OSError, MemoryError son todos ejemplos; cada uno es una clase, y lanzar una detiene la llamada actual y busca un manejador en el código circundante.
2.25.1. try / except¶
Envuelve un bloque de código en try para capturar cualquier excepción que lance:
try:
n = int(input_text)
except ValueError:
n = 0
Si la conversión int(...) falla, el control salta al bloque except en lugar de propagar el error más allá. Si input_text era una cadena de entero válida, el bloque except se omite.
Un único try puede tener varios bloques except, cada uno capturando un tipo de error distinto:
try:
value = data[key]
except KeyError:
value = None
except TypeError:
value = -1
Python compara en orden; el primero cuya clase de excepción encaje maneja el problema. Capturar Exception (la clase base de casi todo) maneja cualquier error; reserva eso para la capa más externa de un programa donde la alternativa es un fallo.
Advertencia
Un except: desnudo (sin clase después de la palabra clave) también captura KeyboardInterrupt – la excepción que el IDE envía cuando pulsas su botón stop para interrumpir un script en ejecución. Un bucle envuelto en un except: pass desnudo se tragará la interrupción y seguirá ejecutándose, sin dejar ninguna forma de detener el script salvo apagar y encender.
Prefiere except Exception: antes que except: desnudo cuando realmente necesites capturar de forma amplia. KeyboardInterrupt hereda de BaseException, no de Exception, de modo que except Exception: deja el botón de stop funcionando.
2.25.1.1. Inspeccionar la excepción¶
Para leer el mensaje asociado a una excepción, nómbrala con as:
try:
f = open("data.txt")
except OSError as e:
print("could not open file:", e)
La variable vinculada por as solo es válida dentro del bloque except.
2.25.2. else y finally¶
Un bloque try tiene dos extras opcionales.
else se ejecuta solo cuando el try terminó sin lanzar:
try:
value = compute()
except ValueError:
print("bad input")
else:
print("got", value)
Poner «qué hacer cuando funcionó» en else mantiene el bloque try reducido – solo la línea que podría fallar pertenece a try.
finally se ejecuta al final pase lo que pase – ya sea que el try tuviera éxito, lanzara y se manejara, o lanzara y esté a punto de propagarse:
try:
do_work()
finally:
cleanup()
finally siempre se ejecuta. else se ejecuta solo en la ruta sin excepción.¶
Para la mayoría de los patrones de adquirir/liberar, prefiere un gestor de contexto antes que un par try / finally – el propio recurso gestiona su propia limpieza.
2.25.3. Excepciones integradas comunes¶
Una breve lista de las excepciones con las que te encontrarás a menudo:
ValueError– tipo correcto, valor incorrecto (bytes([300])– 300 es del tipo correcto, pero está fuera del rango de bytes válido de 0..255).TypeError– tipo totalmente incorrecto (len(42)).IndexError– índice más allá del final de una secuencia.AttributeError– acceder a un atributo que no existe ("abc".foo).OSError– un fallo de sistema de archivos o de E/S.MemoryError– se agotó el montículo (heap). En un entorno de ejecución con memoria limitada, esto puede ocurrir durante el funcionamiento normal – no solo en casos patológicos.