Curso de Python / Gestionar excepciones con try, except, else, finally y raise
El manejo de excepciones permite distinguir fallos previstos de los que puedes recuperarte o informar a quien llama. Mantén pequeño el bloque try y captura únicamente los errores que sabes gestionar, para que los defectos no relacionados sigan siendo visibles.
Entender las distintas rutas de ejecución
Una excepción dentro de try transfiere el control a un bloque except compatible. else se ejecuta cuando try termina sin excepción. finally permite realizar la limpieza tanto en la salida normal como en la salida por excepción.
Un return dentro de finally puede suprimir una excepción pendiente o sustituir un valor que ya iba a devolverse. Normalmente no es el lugar apropiado para decidir el resultado de la operación. Utiliza raise para señalar expresamente una regla incumplida.
Una entrada que el usuario puede corregir no es el mismo caso que un fallo de almacenamiento que debe comunicarse a una capa superior. La guía oficial de errores y excepciones explica cómo se seleccionan y propagan los manejadores.
Ejecutar importes válidos e inválidos
Guarda este programa como exceptions_demo.py en UTF-8. Ejecuta python exceptions_demo.py desde la carpeta de práctica con el entorno del proyecto seleccionado. En macOS o Ubuntu, utiliza python3 fuera del entorno si corresponde al intérprete elegido.
def parse_amount(text):
amount = int(text)
if amount < 0:
raise ValueError("amount must be nonnegative")
return amount
for text in ["8000", "abc", "-1"]:
try:
amount = parse_amount(text)
except ValueError as error:
print("invalid:", text)
else:
print("accepted:", amount)
finally:
print("checked")
La salida esperada permite seguir qué bloques se ejecutan en cada entrada:
accepted: 8000
checked
invalid: abc
checked
invalid: -1
checked
8000 se convierte correctamente y llega a else. abc falla durante la conversión a entero. -1 se convierte, pero incumple la regla de importe no negativo y la función lanza otra excepción de tipo ValueError. Finalmente se imprime checked en las tres iteraciones.
Gestionar la causa en el límite adecuado
Una conversión puede producir ValueError; abrir un archivo puede producir FileNotFoundError o PermissionError. Escribir except Exception: pass oculta esas diferencias y permite que el programa continúe con un estado posiblemente inválido.
Capturar una excepción y devolver un valor permite continuar a quien llama. Un raise sin argumentos dentro de except vuelve a propagar la excepción original. Si un error no es recuperable en esa capa, añade contexto útil y propágalo en lugar de tratar el registro del fallo como si fuera una recuperación.
Cuando necesitas presentar una excepción de nivel superior conservando su causa, utiliza raise NewError(...) from error. Para recursos, prefiere gestores de contexto como with cuando existan. Una limpieza manual en finally debe considerar que el recurso quizá no llegó a inicializarse; los gestores de contexto desarrollan esa organización.
Comprobar recuperación y limpieza por separado
- Añade la cadena
"0"y comprueba que se acepta. - Añade una cadena vacía y observa el fallo durante la conversión con int.
- Compara una entrada no numérica con un importe negativo para distinguir la etapa y la regla que causa cada error.
Decide qué respuesta permite al usuario corregir la entrada y qué información necesita el código que llama. No sustituyas automáticamente un error por cero o una cadena vacía si esos valores también representan datos válidos.
Los mensajes de excepción pueden incluir credenciales, tokens o datos personales. Proporciona una explicación útil al usuario y limita los registros a los datos necesarios para diagnosticar la operación. La depuración y el registro con logging distinguen la orientación al usuario del detalle técnico.




