¿Cómo manejar correctamente excepciones en bloques try-except de Python?

wind17 IN 📗 Estudiante 👁 31 ⚑ Denunciar Programación

Llevo un par de años escribiendo Python y todavía no sé si debería capturar excepciones específicas o simplemente usar una cláusula except amplia. Mi código actual tiene muchos manejadores de excepciones genéricos y me pregunto si eso es realmente una mala práctica o si está bien para proyectos más pequeños.

2 respuestas

★ Mejor respuesta

¿Qué está haciendo tu código exactamente cuando esas excepciones ocurren - las registras, reintentas, o simplemente continúas sin decir nada?

La razón por la que la gente insiste en excepciones específicas es que un `except:` simple o `except Exception:` va a capturar literalmente todo, incluyendo cosas que no anticipaste y probablemente no deberías estar silenciando. Si estás tratando de abrir un archivo y capturas `FileNotFoundError`, eso es específico y tiene sentido. Pero un except simple también va a capturar cosas como `KeyboardInterrupt` o `SystemExit`, que normalmente quieres dejar pasar. Peor aún, esconde bugs - si tu código tiene un typo o un error lógico que lanza algo inesperado, nunca lo verás porque la cláusula except se lo tragó.

Dicho esto, para scripts más pequeños o cosas rápidas, la gente se vuelve pragmática. La diferencia realmente se nota cuando estás debuggeando o cuando tu código se lo pasas a alguien más. Las excepciones específicas hacen tu intención clara - este código sabe cómo manejar un archivo faltante, pero no un problema de conexión a base de datos. Si estás escribiendo algo que va a seguir siendo pequeño, capturar `Exception` (no un except simple) es mucho más seguro que un manejador genérico, y al menos puedes ver qué está siendo capturado. A medida que tus proyectos crecen, vas a querer ser más específico. La práctica de ser deliberado sobre qué capturas no es solo pedantería - te salva de bugs misteriosos después.

wind17 asker Actualmente solo les hago logging y sigo adelante. Mayormente se trata de I/O de archivos y llamadas a APIs en scripts pequeños, así que todavía no he tenido problemas, pero veo tu punto sobre bugs ocultos.

Las excepciones específicas le ganan a las genéricas porque atraparás bugs que no tenías intención de ocultar - como un typo en el nombre de una variable que genera `NameError`, que un `except:` desnudo va a esconder en lugar de dejarte arreglarlo. Incluso para proyectos más chicos, el hábito rinde rápido; siempre puedes agrupar excepciones relacionadas como `except (ValueError, TypeError):` si quieres mantenerlo simple.

El verdadero obstáculo que la gente pasa por alto: un `except:` desnudo incluso atrapa cosas como `KeyboardInterrupt` y `SystemExit`, así que tu programa podría ignorar un Ctrl+C del usuario y seguir ejecutándose. Usa `except Exception:` como mínimo absoluto si necesitas un catch-all, pero honestamente, dedica 30 segundos a pensar qué podría fallar de verdad y lista eso.

Tu respuesta

Iniciar sesiónpara responder.