El argumento principal del libro es que la versión de excepción del código es mejor porque detectará todo lo que podría haber pasado por alto si intenta escribir su propia comprobación de errores.
Creo que esta afirmación es cierta solo en circunstancias muy específicas, donde no le importa si el resultado es correcto.
No hay duda de que generar excepciones es una práctica segura y segura. Debe hacerlo siempre que sienta que hay algo en el estado actual del programa que usted (como desarrollador) no puede o no quiere tratar.
Su ejemplo, sin embargo, se trata de detectar excepciones. Si detecta una excepción, no se protege de escenarios que podría haber pasado por alto. Estás haciendo exactamente lo contrario: asumes que no has pasado por alto ningún escenario que podría haber causado este tipo de excepción y, por lo tanto, estás seguro de que está bien atraparlo (y así evitar que haga que el programa salga, como lo haría cualquier excepción no descubierta).
Usando el enfoque de excepción, si ve una ValueError
excepción, omite una línea. Usando el enfoque tradicional sin excepción, cuenta el número de valores devueltos split
y, si es menor que 2, omite una línea. ¿Debería sentirse más seguro con el enfoque de excepción, ya que puede haber olvidado algunas otras situaciones de "error" en su verificación de error tradicional y las except ValueError
detectaría por usted?
Esto depende de la naturaleza de su programa.
Si está escribiendo, por ejemplo, un navegador web o un reproductor de video, un problema con las entradas no debería causar que se bloquee con una excepción no detectada. Es mucho mejor generar algo remotamente sensible (incluso si, estrictamente hablando, incorrecto) que renunciar.
Si está escribiendo una aplicación donde la corrección es importante (como software comercial o de ingeniería), este sería un enfoque terrible. Si olvidó algún escenario que surge ValueError
, lo peor que puede hacer es ignorar en silencio este escenario desconocido y simplemente omitir la línea. Así es como los errores muy sutiles y costosos terminan en el software.
Puede pensar que la única forma en que puede ver ValueError
en este código es si split
devuelve un solo valor (en lugar de dos). Pero, ¿qué print
pasa si su declaración luego comienza a usar una expresión que surge ValueError
bajo ciertas condiciones? Esto hará que omita algunas líneas no porque se pierdan :
, sino porque print
fallan en ellas. Este es un ejemplo de un error sutil al que me refería anteriormente: no notarías nada, solo perderías algunas líneas.
Mi recomendación es evitar capturar (¡pero no aumentar!) Excepciones en el código donde producir resultados incorrectos es peor que salir. La única vez que detectaría una excepción en dicho código es cuando tengo una expresión verdaderamente trivial, por lo que puedo razonar fácilmente qué puede causar cada uno de los posibles tipos de excepción.
En cuanto al impacto en el rendimiento del uso de excepciones, es trivial (en Python) a menos que se encuentren excepciones con frecuencia.
Si usa excepciones para manejar condiciones que ocurren de manera rutinaria, en algunos casos puede pagar un costo de rendimiento enorme. Por ejemplo, suponga que ejecuta remotamente algún comando. Puede verificar que el texto de su comando pase al menos la validación mínima (por ejemplo, sintaxis). O puede esperar a que se genere una excepción (lo que ocurre solo después de que el servidor remoto analiza su comando y encuentra un problema con él). Obviamente, el primero es órdenes de magnitud más rápido. Otro ejemplo simple: puede verificar si un número es cero ~ 10 veces más rápido que intentar ejecutar la división y luego detectar la excepción ZeroDivisionError.
Estas consideraciones solo importan si con frecuencia envía cadenas de comandos con formato incorrecto a servidores remotos o recibe argumentos de valor cero que utiliza para la división.
Nota: Asumo que usaría except ValueError
en lugar de los justos except
; como otros señalaron, y como el libro mismo dice en unas pocas páginas, nunca debes usar desnudo except
.
Otra nota: el enfoque adecuado sin excepción es contar el número de valores devueltos por split
, en lugar de buscar :
. Este último es demasiado lento, ya que repite el trabajo realizado split
y puede casi duplicar el tiempo de ejecución.