EIB · Tema 5: Manejo de excepciones y código robusto

Tema 5: Manejo de excepciones y código robusto es uno de los temas públicos de Estructuras de Control en Python dentro de TesIA Exam. Aquí puedes localizar preguntas indexables, tests, cuestionarios y exámenes que lo incluyen.

15 preguntas 1 exámenes Material de estudio público

Cómo estudiar este tema

Primero lee el resumen completo para fijar el marco del tema. Después usa la guía de estudio para ordenar el repaso y termina con las preguntas, revisando siempre la respuesta correcta y la explicación breve.

Esta página pública está pensada para consulta y repaso. Para practicar con progreso, favoritos y modo examen puedes continuar dentro de TesIA Exam con los mismos exámenes relacionados.

Material de estudio disponible

Aquí se muestran el resumen completo, la guía completa y los recursos públicos enlazados del tema para que la página sea útil también fuera de la app.

Resumen del tema

Manejo de Excepciones y Código Robusto: Guía de Desarrollo Profesional

Resumen Ejecutivo

El desarrollo de aplicaciones profesionales de nivel superior exige la transición del simple código funcional hacia la creación de software robusto. Un programa se considera robusto cuando es capaz de anticiparse a fallos y reaccionar ante errores inesperados —como fallos de red, archivos inexistentes o entradas de usuario inválidas— sin detener su ejecución de forma abrupta.

Este documento sintetiza las estrategias críticas para la gestión de errores en Python, desde el uso técnico de bloques try-except hasta la implementación de validaciones en capas, técnicas de depuración profesional y principios de código limpio. La adopción del estilo EAFP (Easier to Ask Forgiveness than Permission), preferido en la comunidad Python, junto con la programación defensiva y las pruebas unitarias, constituye el estándar para garantizar aplicaciones confiables, mantenibles y escalables.


--------------------------------------------------------------------------------


1. Conceptos Fundamentales de Errores y Excepciones

Para gestionar fallos eficazmente, es imperativo distinguir entre los tres tipos de errores que pueden presentarse en un desarrollo:

Categorización de Errores

* Errores de Sintaxis: Ocurren cuando el código no sigue las reglas del lenguaje (ej. olvidar un :). El intérprete no puede entender ni ejecutar el código.
* Errores de Ejecución (Excepciones): La sintaxis es correcta, pero ocurre un evento inesperado durante la ejecución que interrumpe el flujo normal (ej. ZeroDivisionError).
* Errores Lógicos: El programa funciona y termina, pero produce un resultado incorrecto (ej. errores en el orden de operaciones matemáticas). Son los más complejos de detectar.

Excepciones Comunes en Python

Python ofrece excepciones predefinidas para diversos escenarios:

Excepción Significado Ejemplo
AttributeError Referencia a atributo o método inexistente 'hola'.splik()
IndexError Subíndice de secuencia fuera de rango (1, 2)[5]
KeyError Clave de diccionario no encontrada {'x': 1}['z']
TypeError Operación sobre un tipo inapropiado 'x' / 3
ValueError Tipo correcto, pero valor inapropiado int('x')
ZeroDivisionError División o módulo por cero 1 / 0
FileNotFoundError Intento de abrir un archivo que no existe open('data.txt')


--------------------------------------------------------------------------------


2. Gestión Técnica de Errores: Bloques Try-Except

La captura de excepciones evita que Python aborte la ejecución del programa. La estructura profesional se basa en la especificidad y la gestión de recursos.

Estructura Avanzada

Además de try y except, Python permite un control total mediante:

* else: Se ejecuta únicamente si el bloque try no generó errores. Es ideal para acciones que dependen del éxito previo.
* finally: Se ejecuta siempre, haya o no error. Su función principal es la limpieza (cierre de archivos o conexiones).
* raise: Permite al programador lanzar una excepción intencionadamente para validaciones tempranas o control del flujo.

Buenas Prácticas en el Manejo de Excepciones

1. Especificidad: Nunca usar except Exception: o except: pass de forma genérica, ya que puede ocultar errores críticos (como la señal de interrupción CTRL+C).
2. Bloques Try Reducidos: Mantener poco código dentro del try para localizar exactamente qué instrucción produjo el fallo.
3. Agrupación: Es posible tratar múltiples excepciones con el mismo comportamiento usando una tupla: except (ZeroDivisionError, ValueError) as e:.
4. Gestores de Contexto: Utilizar la instrucción with para el manejo de archivos, asegurando su cierre automático incluso ante excepciones.


--------------------------------------------------------------------------------


3. Prevención, Depuración y Validación

La mejor gestión de excepciones es evitar que estas ocurran mediante estrategias preventivas y validaciones rigurosas.

Estrategias de Prevención

* Programación Defensiva: No asumir que los datos de entrada son correctos; validar tipos, nulos y rangos antes de procesar.
* Tipado Estático (Type Hints): Usar anotaciones de tipo para detectar errores de forma temprana durante el desarrollo.
* LBYL vs. EAFP: Mientras que Look Before You Leap (LBYL) usa if para verificar condiciones, el estilo preferido en Python es Easier to Ask Forgiveness than Permission (EAFP), que intenta la operación y captura el error resultante.

Niveles de Validación de Datos

La validación profesional se organiza en cuatro capas:

1. Tipos: Asegura que el dato sea el tipo primitivo correcto (usando try-except con ValueError).
2. Rango: Verifica que el valor tenga sentido lógico (ej. edad no negativa) mediante if/elif/else.
3. Formato: Comprueba patrones específicos (ej. códigos de producto) usando expresiones regulares (módulo re).
4. Lógica de Negocio: Verifica la compatibilidad con reglas externas o bases de datos.

Técnicas de Depuración (Debugging)

1. Print Debugging: Uso de f-strings (ej. print(f"{variable=}")) para rastrear valores.
2. Logging: Uso del módulo logging para categorizar mensajes (DEBUG, INFO, WARNING, ERROR, CRITICAL) y guardarlos en archivos.
3. PDB: Uso del depurador interactivo de Python para pausar la ejecución y explorar variables.


--------------------------------------------------------------------------------


4. Principios de Código Limpio y Mantenibilidad

El código robusto debe ser también legible y fácil de mantener.

* Responsabilidad Única: Cada función debe realizar una sola tarea.
* Nombres Significativos: Las variables y funciones deben revelar su intención sin necesidad de comentarios adicionales. Se debe usar snake_case.
* Evitar Anidaciones (Cláusulas de Guarda): En lugar de anidar múltiples niveles de if, se recomienda usar validaciones al inicio de la función que retornen temprano si no se cumplen las condiciones.
* Principio DRY (Don't Repeat Yourself): Abstraer la repetición en funciones para facilitar el mantenimiento.
* Pruebas Unitarias (Unit Testing): Implementar módulos como unittest o pytest (preferido por su simplicidad con assert) para verificar automáticamente que el código funciona como se espera tras cada cambio.


--------------------------------------------------------------------------------


Conclusión

El manejo profesional de excepciones no consiste simplemente en "evitar que el programa falle", sino en gestionar los errores de forma que la aplicación sea confiable y transparente para el usuario. Esto se logra mediante la combinación de una sintaxis de error avanzada, validaciones en capas, sanitización de datos (como el uso de .strip(), .lower() y .replace()) y el cumplimiento estricto de los principios de código limpio.

Guía de estudio

Guía de Estudio: Manejo de Excepciones y Código Robusto en Python

Esta guía de estudio sintetiza los conceptos fundamentales para el desarrollo de aplicaciones profesionales mediante la gestión de errores, la validación de datos y la implementación de código limpio.


--------------------------------------------------------------------------------


Cuestionario de Repaso: Preguntas de Respuesta Corta

Responda a las siguientes preguntas basándose en los conceptos de manejo de excepciones y robustez de código.

1. ¿Qué define a un programa como "robusto" según el material de estudio?
2. Explique la diferencia fundamental entre un error de sintaxis y un error de ejecución.
3. ¿Cuál es la función específica de la cláusula finally en un bloque de gestión de errores?
4. ¿Por qué se considera una mala práctica el uso de except Exception: o el silenciamiento de errores con pass?
5. Describa la utilidad de la instrucción raise en la validación de datos.
6. ¿En qué consiste la filosofía EAFP y cómo se diferencia de LBYL?
7. Mencione y explique brevemente dos métodos de depuración (debugging) mencionados en el texto.
8. ¿Qué es la "sanitización de datos" y qué métodos de Python se utilizan para realizarla?
9. Explique el concepto de "Cláusulas de Guarda" en el contexto de código limpio.
10. ¿Cuáles son las cuatro capas diferenciadas en las que se debe realizar la validación de datos?


--------------------------------------------------------------------------------


Clave de Respuestas

1. Un programa es robusto cuando cuenta con líneas de código que le indican al software cómo reaccionar ante fallos inesperados (como archivos inexistentes o conexiones fallidas) sin detener su ejecución de forma abrupta.
2. Los errores de sintaxis ocurren cuando no se siguen las reglas del lenguaje (ej. olvidar un ":") e impiden que el intérprete entienda el código. Los errores de ejecución ocurren con sintaxis correcta, pero el flujo se interrumpe por un suceso inesperado (ej. ZeroDivisionError).
3. La cláusula finally se ejecuta siempre, independientemente de si ocurrió un error o no. Su propósito principal es realizar tareas de limpieza, como cerrar archivos o conexiones de red.
4. Capturar la excepción genérica Exception puede atrapar señales del sistema como CTRL+C, impidiendo detener el programa. Silenciar errores con pass oculta fallos que deberían ser corregidos o informados al usuario.
5. raise permite al programador lanzar una excepción de forma intencionada. Se usa para validación temprana (evitar procesar datos incorrectos) y para dar mensajes más claros sobre errores específicos de la lógica de negocio.
6. EAFP (Easier to Ask for Forgiveness than Permission) prefiere intentar la operación y capturar el error si ocurre; es el estilo preferido en Python. LBYL (Look Before You Leap) verifica todas las condiciones con if antes de actuar.
7. El Print Debugging usa print() para mostrar el flujo y valores; el Logging es un método profesional que categoriza mensajes por importancia (DEBUG, INFO, etc.); y los Depuradores Interactivos como pdb permiten pausar la ejecución línea a línea.
8. Es la limpieza de la entrada del usuario antes de validarla. Se usan métodos como .strip() (elimina espacios), .lower()/.upper() (normaliza mayúsculas/minúsculas) y .replace() (elimina caracteres no deseados).
9. Son validaciones que se colocan al inicio de una función para manejar casos de error rápidamente y retornar. Esto elimina anidamientos innecesarios de if/else, reduciendo la carga cognitiva y mejorando la legibilidad.
10. Las capas son: 1) Validación de Tipos (primitivos correctos), 2) Validación de Rango (valores con sentido), 3) Validación de Formato (patrones específicos con RegEx) y 4) Lógica de Negocio (compatibilidad con bases de datos o ficheros).


--------------------------------------------------------------------------------


Temas de Ensayo Sugeridos

Instrucción: Utilice el contexto proporcionado para desarrollar una respuesta extensa y argumentada para las siguientes propuestas.

1. La transición de la programación amateur a la profesional: Analice por qué el manejo de excepciones y la escritura de código robusto se consideran el "último paso" en el desarrollo de aplicaciones de nivel profesional.
2. Estrategias de Validación y Seguridad: Discuta la importancia de la validación en capas y la sanitización de entradas como la primera línea de defensa contra fallos de software.
3. Principios de Código Limpio (Clean Code): Explique cómo la aplicación de conceptos como la Responsabilidad Única, el principio DRY y el uso de Nombres Significativos contribuyen a la mantenibilidad de un proyecto a largo plazo.
4. Gestión de Recursos y Context Managers: Evalúe las ventajas de utilizar el bloque with y la cláusula finally para garantizar la integridad de los recursos del sistema (archivos, conexiones) en entornos donde pueden ocurrir excepciones.
5. Cultura de Pruebas y Depuración: Compare el uso de pruebas unitarias con pytest frente a métodos de depuración tradicionales, destacando las características de aislamiento y determinismo.


--------------------------------------------------------------------------------


Glosario de Términos Clave

Término Definición
Assert Herramienta básica utilizada en pruebas unitarias para verificar que el código produce el resultado esperado.
AttributeError Excepción lanzada cuando se intenta hacer referencia a un atributo o método que no existe en un objeto.
DRY (Don't Repeat Yourself) Principio de diseño que busca reducir la repetición de código abstrayendo la lógica común en funciones o clases.
Docstrings Comentarios utilizados para documentar el "porqué" de las decisiones de diseño en el código.
Expresiones Regulares (re) Herramienta para validar si una cadena de texto sigue un patrón específico (ej. 2 letras y 4 dígitos).
FileNotFoundError Error que ocurre al intentar abrir un archivo que no se encuentra en la ruta especificada.
IndexError Excepción producida cuando se intenta acceder a un índice que está fuera del rango de una secuencia (lista o tupla).
KeyError Error que ocurre cuando se intenta acceder a una clave que no existe en un diccionario.
Programación Defensiva Estrategia de desarrollo que consiste en no asumir que los datos de entrada son correctos y validar siempre antes de procesar.
Snake_case Convención de nombres recomendada en Python donde las palabras se separan por guiones bajos.
Type Hints Anotaciones de tipo en el código que ayudan a detectar errores rápidamente y documentar el tipo de datos esperado.
TypeError Excepción que ocurre al intentar realizar una operación sobre un tipo de dato inapropiado (ej. dividir texto entre un número).
ValueError Error que se lanza cuando el tipo de dato es correcto pero el valor es inapropiado (ej. convertir "hola" a entero).
ZeroDivisionError Excepción específica que se lanza cuando se intenta realizar una división o módulo por cero.

Preguntas, respuestas y explicaciones del tema

Listado público sin duplicados de las preguntas del tema, con su respuesta correcta y una explicación breve para facilitar el estudio y el repaso desde buscadores.

#1

Pregunta 6. Pydantic utiliza anotaciones de tipo para realizar validaciones automáticas de datos

  1. A) Verdadero
  2. B) Falso
Respuesta correcta

A) Verdadero

Explicación:

La respuesta correcta es A. La respuesta correcta es Verdadero. Pydantic aprovecha los 'type hints' de Python para forzar el cumplimiento de tipos en tiempo de ejecución.

#2

Pregunta 8. Es una buena práctica silenciar errores usando "except pass" frecuentemente

  1. A) Verdadero
  2. B) Falso
Respuesta correcta

B) Falso

Explicación:

La respuesta correcta es B. also. Silenciar excepciones sin gestionarlas es una de las peores prácticas en programación (conocida como 'swallowing exceptions').

#3

Pregunta 12. ¿Qué característica de las pruebas unitarias asegura que den el mismo resultado si el código no ha cambiado?

  1. A) Refactorización
  2. B) Rapidez
  3. C) Determinismo
  4. D) Aislamiento
Respuesta correcta

C) Determinismo

Explicación:

La respuesta correcta es C. l Determinismo. Esta propiedad garantiza que la ejecución de un test sea predecible y reproducible en cualquier entorno.

#4

Pregunta 14. ¿Cuál es la función de las "cláusulas de guarda" en el Clean Code?

  1. A) Asegurar que los archivos se cierren con gestores de contexto
  2. B) Obligar al uso de Type Hints en todas las variables
  3. C) Validar condiciones de error al inicio de una función para evitar anidamientos excesivos
  4. D) Permitir que una función realice múltiples responsabilidades (SRP)
Respuesta correcta

C) Validar condiciones de error al inicio de una función para evitar anidamientos excesivos

Explicación:

La respuesta correcta es C. La respuesta correcta es validar condiciones de error al inicio de la función. Las cláusulas de guarda permiten 'salir' de la función inmediatamente si los argumentos son inválidos, dejando el camino libre para la lógica.

#5

Pregunta 7. Empareja el archivo de logging con su configuración

Tipo: relacionar columnas.

Columna A

  • Filename
  • Filemode 'w'
  • Filemode 'a'
  • Format

Columna B

  • Ruta del archivo de registro
  • Sobrescribir el archivo
  • Añadir al final del archivo
  • Estructura del mensaje (fecha, nivel)
Respuesta correcta
  • Filename -> Ruta del archivo de registro
  • Filemode 'w' -> Sobrescribir el archivo
  • Filemode 'a' -> Añadir al final del archivo
  • Format -> Estructura del mensaje (fecha, nivel)
Explicación:

La respuesta correcta describe los parámetros de configuración del módulo 'logging' de Python. 'Filename' indica dónde se guardarán los registros físicamente. El modo 'w' borra el contenido previo al iniciar, mientras que 'a' (append) conserva los registros antiguos añadiendo los nuevos debajo. 'Format' define qué metadatos acompañarán al texto del log para facilitar su posterior análisis.

#6

Pregunta 2. Empareja la herramienta de prueba con su origen

Tipo: relacionar columnas.

Columna A

  • Pydantic
  • pytest
  • pdb

Columna B

  • Validación de datos y tipos
  • Framework de pruebas unitarias
  • Depurador nativo de Python
Respuesta correcta
  • Pydantic -> Validación de datos y tipos
  • pytest -> Framework de pruebas unitarias
  • pdb -> Depurador nativo de Python
Explicación:

La respuesta correcta asocia cada herramienta técnica con su función primordial dentro del ecosistema de Python. Pydantic se especializa en la validación de esquemas y tipos de datos mediante anotaciones. Pytest es el estándar de facto para escribir y ejecutar suites de pruebas unitarias de manera eficiente. Por su parte, pdb es el módulo integrado en la biblioteca estándar que permite inspeccionar el código paso a paso.

#7

Pregunta 3. Empareja el nivel de validación con su objetivo

Tipo: relacionar columnas.

Columna A

  • Format Validation
  • Business Logic
  • Type Validation
  • Domain Validation

Columna B

  • Estructura (Email, DNI)
  • Reglas de negocio complejas
  • Clase del dato (int, str)
  • Rangos y valores válidos
Respuesta correcta
  • Format Validation -> Estructura (Email, DNI)
  • Business Logic -> Reglas de negocio complejas
  • Type Validation -> Clase del dato (int, str)
  • Domain Validation -> Rangos y valores válidos
Explicación:

La respuesta correcta establece la jerarquía de comprobaciones necesarias para un código robusto. La validación de formato asegura que los strings sigan patrones como una dirección de correo. La validación de tipos confirma que el dato sea, por ejemplo, un entero antes de operar.

#8

Pregunta 4. ¿Qué procesos se consideran "sanitización" de datos en Python?

  1. A) Validar el rango con un if
  2. B) Capturar un ValueError con try
  3. C) Normalizar a minúsculas (lower)
  4. D) Eliminar espacios con strip()
Respuesta correcta
  • C) Normalizar a minúsculas (lower)
  • D) Eliminar espacios con strip()
Explicación:

La respuesta correcta es C y D. La respuesta correcta son las opciones C y D.
La sanitización consiste en limpiar o transformar la entrada para que sea uniforme, como quitar espacios extra o igualar mayúsculas.

#9

Pregunta 13. El uso de 'with' (Context Manager) garantiza que los recursos se liberen aunque ocurra una excepción

  1. A) Verdadero
  2. B) Falso
Respuesta correcta

A) Verdadero

Explicación:

La respuesta correcta es A. La respuesta correcta es Verdadero. La sentencia 'with' invoca automáticamente los métodos especiales del protocolo de gestión de contexto (__enter__ y __exit__).

#10

Pregunta 1. En Python, "explícito es mejor que implícito", por lo que se deben capturar excepciones específicas

  1. A) Verdadero
  2. B) Falso
Respuesta correcta

A) Verdadero

Explicación:

La respuesta correcta es A. La respuesta correcta es Verdadero.
Siguiendo la filosofía del Zen de Python (PEP 20), es fundamental que el programador sea preciso al gestionar errores para evitar que fallos inesperados queden ocultos.

#11

Pregunta 9. Seleccione las excepciones que se clasifican como "Excepciones de datos y tipos" o "Matemáticas" según la tabla de los apuntes

  1. A) FileNotFoundError
  2. B) TypeError
  3. C) ZeroDivisionError
  4. D) ValueError
Respuesta correcta
  • B) TypeError
  • C) ZeroDivisionError
  • D) ValueError
Explicación:

La respuesta correcta es B, C y D. La respuesta correcta incluye TypeError, ZeroDivisionError y ValueError. Estas excepciones ocurren cuando los datos no son del tipo esperado, se intenta una operación matemática imposible o el valor es inapropiado para una.

#12

Pregunta 15. El error de sintaxis ocurre exclusivamente en tiempo de ejecución

  1. A) Verdadero
  2. B) Falso
Respuesta correcta

B) Falso

Explicación:

La respuesta correcta es B. also. Los errores de sintaxis (SyntaxError) son detectados por el intérprete de Python durante la fase de análisis (parsing) antes de que el programa comience a ejecutarse.

#13

Pregunta 5. Las pruebas unitarias deben ser deterministas, es decir, dar siempre el mismo resultado si el código no cambia

  1. A) Verdadero
  2. B) Falso
Respuesta correcta

A) Verdadero

Explicación:

La respuesta correcta es A. La respuesta correcta es Verdadero. El determinismo es una propiedad esencial de los tests para garantizar que los fallos detectados se deban exclusivamente a cambios en la lógica del código.

#14

Pregunta 10. En la validación de un cajero automático, ¿qué errores se suelen lanzar con raise?

  1. A) ValueError (para cantidades negativas)
  2. B) RuntimeError (para fondos insuficientes)
  3. C) StopIteration (para fin de sesión)
  4. D) SyntaxError (para claves incorrectas)
Respuesta correcta
  • A) ValueError (para cantidades negativas)
  • B) RuntimeError (para fondos insuficientes)
Explicación:

La respuesta correcta es A y B. ValueError es adecuado para indicar que un dato (cantidad) no cumple con los requisitos lógicos. RuntimeError o una excepción personalizada son apropiados para estados de error durante la ejecución como.

#15

Pregunta 11. ¿Por qué se considera una mala práctica usar "except Exception" de forma genérica?

  1. A) Porque consume demasiada memoria del sistema.
  2. B) Porque obliga al programador a usar bloques try más grandes
  3. C) Porque atrapa incluso señales de control no deseadas como el CTRL+C
  4. D) Porque solo funciona para errores de tipo ValueError
Respuesta correcta

C) Porque atrapa incluso señales de control no deseadas como el CTRL+C

Explicación:

La respuesta correcta es C. La respuesta correcta es que atrapa señales de control como el atajo de teclado para interrumpir el programa. Al usar la clase base Exception, el programa puede volverse 'imparable' ante intentos legítimos de cierre por parte del.

Exámenes que incluyen este tema

Practicar este tema en TesIA Exam

Abre la app para entrenar este contenido en modo estudio o examen y guardar tu progreso.

Abrir TesIA Exam