Hay dos maneras de proceder cuando hay varias excepciones:
La primera consiste en simplemente añadir dos bloques try separados, uno que incluya la invocación de la función input() donde se puede generar el ValueError, y el segundo dedicado a manejar posibles problemas causados por la división. Ambos bloques try tendrían sus propias ramas except, y como resultado, obtendrás control total sobre dos errores diferentes.
Esta solución es buena, pero es un poco extensa – el código se vuelve innecesariamente largo. Además, no es el único peligro. Al salir del primer bloque try-except deja mucha incertidumbre – se tendrá que añadir código extra para asegurar que el valor que el usuario ha ingresado sea seguro para usar. Así es como una solución aparentemente simple se vuelve complicada.
En el siguiente código puedes ver un ejemplo de esta solución:

Explicación del código
Definición de la función calculate_reciprocal:
La función no recibe argumentos y su propósito es calcular el recíproco de un número natural proporcionado por el usuario.
Primer bloque try:

Aquí se intenta convertir la entrada del usuario a un número entero. Si el usuario ingresa algo que no puede ser convertido (como texto o un decimal), se captura la excepción ValueError.
Si ocurre un ValueError, se imprime un mensaje de error y se utiliza return para salir de la función, evitando que el código continúe.
Segundo bloque try:

Aquí se intenta calcular el recíproco del valor ingresado. Si el usuario ingresó 0, esto provocaría una excepción ZeroDivisionError.
Si se produce un ZeroDivisionError, se captura y se imprime un mensaje de error adecuado.
Ejemplo de uso
Se puede llamar a la función de la siguiente manera:

Ejecución y Pruebas
Puedes probar la función con diferentes entradas:
Entrada válida: 5 → Salida: El recíproco de 5 es 0.2

Entrada inválida: abc → Salida: Error: No se pudo convertir la entrada a un número entero. Por favor, ingresa un número válido.

Entrada cero: 0 → Salida: Error: La división por cero no se puede realizar.

salida en la pantalla de PythoN:

Este enfoque ilustra cómo manejar múltiples excepciones usando bloques try-except separados. Si bien este método ofrece un control total sobre las excepciones, puede hacer que el código sea más largo y, como se mencionó, puede generar incertidumbre al no validar el valor ingresado antes de usarlo en operaciones matemáticas. Esto resalta la importancia de diseñar un manejo de excepciones que sea claro y eficiente.
Afortunadamente, Python ofrece una forma más sencilla de abordar este tipo de problema.
Dos excepciones después de un solo try

Se ha introducido la segunda rama except. Esta no es la única diferencia – ambas ramas tienen especificados los nombres de las excepciones. En esta variante, cada una de las excepciones esperadas tiene su propia forma de manejar el error, pero es importante enfatizar que solo una de todas las ramas puede interceptar el control – si una de las ramas se ejecuta, todas las demás permanecen inactivas.
Además, el número de ramas except no está limitado – se puede especificar tantas o tan pocas como se necesite, pero ninguna de las excepciones puede ser especificada más de una vez.
Bloque try:
El bloque try es donde se coloca el código que puede potencialmente causar un error. Python «intenta» ejecutar este código y, si ocurre un error, busca una forma de manejarlo en los bloques except.

value = int(input(‘Entra un número natural: ‘)):
Esta línea pide al usuario que ingrese un número natural, que es un número entero positivo.
La función input() recibe el valor ingresado por el usuario como una cadena de texto.
La función int() intenta convertir esta cadena en un número entero.
Si el usuario ingresa algo que no puede convertirse en un número entero (como una letra o un símbolo), se genera una excepción ValueError.
print(‘El recíproco de’, value, ‘es’, 1/value):
Si la conversión a entero es correcta, esta línea imprime el número ingresado por el usuario junto con su recíproco (es decir, 1 dividido por el número).
Sin embargo, si el usuario ingresa 0, se genera una excepción ZeroDivisionError porque la división por cero no está permitida.
Bloques except:
Los bloques except se utilizan para manejar las excepciones que pueden ocurrir dentro del bloque try. Cada except está diseñado para manejar un tipo específico de excepción.
Primer except para ValueError:

Este bloque se ejecuta si se genera una excepción ValueError en el bloque try.
Un ValueError ocurre cuando el usuario ingresa un valor que no puede convertirse en un número entero (por ejemplo, si ingresa «avbc» o un número con decimales).
Si se produce esta excepción, el programa muestra el mensaje print(‘No sé qué hacer.’), indicando que el valor ingresado no se pudo procesar correctamente.
Segundo except para ZeroDivisionError:

Este bloque se ejecuta si se genera una excepción ZeroDivisionError en el bloque try.
Un ZeroDivisionError ocurre cuando el usuario ingresa 0, lo que lleva a intentar realizar una operación de división por cero, la cual no está permitida.
Si se produce esta excepción, el programa muestra el mensaje print(‘La división por cero no se puede realizar.’), informando al usuario que la operación no es válida.
El código solicita al usuario que ingrese un número natural y luego intenta calcular e imprimir su recíproco. El uso del bloque try-except permite manejar dos tipos de errores que podrían ocurrir durante la ejecución:
ValueError: Este error se maneja cuando el usuario no ingresa un número entero válido.
ZeroDivisionError: Este error se maneja cuando el usuario ingresa 0, lo que provoca una división por cero.
El uso de múltiples bloques except permite que el programa responda adecuadamente a diferentes tipos de errores, proporcionando mensajes claros y específicos al usuario sobre lo que salió mal.
Contenido Web de Yolanda Muriel está sujeto bajo Licencia Creative Commons Atribución-NoComercial-SinDerivadas 3.0 Unported.

1 comentario