REVIT ARCHITECTURE (955) – PYTHON – Funciones (39) – Excepciones (1)

Todos los programadores quieren escribir código sin errores. Pero se puede decir que es prácticamente imposible escribir código sin errores. Indicamos ésto no como un hecho que deber ser aceptado de por sí, sino como un hecho del cual el programador ha de ser consciente de forma que pueda trabajar de una forma más eficiente.

Errores en los datos vs. errores en el código

Gestionar errores de programación tiene (al menos) dos lados.

Uno aparece cuando el código, aparentemente correcto, recibe datos de entrada incorrectos.  Puede suceder que el código termine abruptamente y el usuario quede solo con un mensaje de error conciso y ambiguo en la pantalla.

El otro caso de gestionar errores de programación se produce cuando el comportamiento indeseable del código es causado por errores que se cometieron al escribir el programa. Este tipo de error se conoce comúnmente como un «bug«.

Vamos a ver un ejemplo de código con error:
Se escribirá un código muy sencillo que leerá un número natural (un entero no negativo) e imprimirá su recíproco. De esta manera, el 2 se convertirá en 0.5 (1/2) y el 4 en 0.25 (1/4).  El código es tan breve y compacto que no parece que vayamos a encontrar ningún problema.

7470

input(‘Enter a natural number: ‘)
La función input() en Python se utiliza para obtener datos del usuario a través de la consola. Cuando se llama a input(), Python muestra el mensaje proporcionado (en este caso, ‘Enter a natural number: ‘) y espera a que el usuario introduzca una entrada.
Resultado: El valor ingresado por el usuario se devuelve como una cadena de texto (tipo str).
int(…)
La función int() convierte un valor a un número entero. En este caso, el valor pasado a int() es la cadena de texto que el usuario ingresó a través de input().
Proceso: Si el usuario ingresa un valor que puede ser interpretado como un número entero (por ejemplo, ‘5’), int() lo convertirá en el entero correspondiente (5).
Errores Potenciales: Si el usuario ingresa algo que no puede convertirse en un entero, como ‘abc’ o una cadena vacía », la función int() lanzará una excepción ValueError.
value = int(input(‘Enter a natural number: ‘))
Esta línea combina los dos pasos anteriores. Primero, el programa solicita al usuario que ingrese un número natural. Luego, la entrada del usuario se convierte a un entero utilizando int(), y el resultado se almacena en la variable value.
Resultado: Si el usuario ingresa, por ejemplo, ‘4’, value contendrá el valor 4 (de tipo int). Si la entrada no es válida, se producirá un error ValueError.
print(‘The reciprocal of’, value, ‘is’, 1/value)
Esta línea imprime un mensaje en la consola, utilizando la función print(). El mensaje muestra el recíproco del número que el usuario ingresó.
Desglose:
‘The reciprocal of’: Esta es una cadena de texto literal que se imprimirá tal cual.
value: Se imprimirá el valor almacenado en la variable value.
‘is’: Otra cadena de texto literal que se imprimirá tal cual.
1/value: Esta es una expresión aritmética que calcula el recíproco de value. El recíproco de un número n es 1/n. Por ejemplo, si value es 4, 1/value será 0.25.
Resultado: Si value es 4, el programa imprimirá The reciprocal of 4 is 0.25.
Posibles Errores y Consideraciones:
ValueError: Como se mencionó antes, si el usuario ingresa algo que no puede ser convertido a un entero, la conversión fallará, y se lanzará un ValueError.
División por Cero: Si el usuario ingresa 0, la expresión 1/value resultará en un error de división por cero (ZeroDivisionError), ya que no se puede dividir entre cero.
Ejemplo de Ejecución:
Entrada válida:

Entrada del usuario: 4
Salida: The reciprocal of 4 is 0.25
Entrada no válida:

Entrada del usuario: ‘abc’
Salida: Lanzamiento de ValueError
Entrada de cero:

Entrada del usuario: 0
Salida: Lanzamiento de ZeroDivisionError

Pero introducir datos que no sean un número entero (lo que también incluye no introducir nada en absoluto) arruinará por completo la ejecución del programa. Esto es lo que verá el usuario del código:

7466

Este fragmento de código y el mensaje de error que aparece están relacionados con un problema común que ocurre cuando se intenta convertir una entrada de usuario en un número entero en Python.

Se explicará a continuación cada una de las líneas de código:

Traceback (most recent call last):

Este es el encabezado de la traza de error, comúnmente conocido como traceback. Indica que ocurrió un error en el programa y está proporcionando información sobre dónde y cómo ocurrió el problema.
«most recent call last» significa que el error más reciente o más cercano al punto final del programa es el que se está mostrando.

File «code.py», line 1, in

Esta línea indica el archivo y la línea exacta en la que ocurrió el error. En este caso, el error se produjo en la línea 1 del archivo code.py.
in sugiere que el error ocurrió dentro de un bloque de código, en este caso, en la función principal o en el nivel superior del script.

value = int(input(‘Enter a natural number: ‘))

Esta es la línea de código donde ocurrió el error. El código intenta hacer lo siguiente:
input(‘Enter a natural number: ‘): Muestra el mensaje ‘Enter a natural number:’ (Ingresa un número natural:) en la consola y espera a que el usuario introduzca algún dato.
int(…): Intenta convertir lo que el usuario haya introducido (que será un string) en un número entero usando la función int().
Si el usuario ingresa un valor válido (por ejemplo, 3), int(‘3’) funcionará correctamente, y value tomará el valor 3. Sin embargo, si el usuario introduce algo que no se puede convertir en un número entero, como una cadena vacía » o letras abc, el programa lanzará un error.

ValueError: invalid literal for int() with base 10: »

Este es el mensaje de error específico que indica la causa del problema.
ValueError: Es el tipo de excepción lanzada. Ocurre cuando una operación recibe un argumento con un tipo correcto, pero un valor inapropiado. En este caso, la función int() recibió una cadena de texto que no puede ser convertida a un entero.
invalid literal for int() with base 10: »: Este mensaje proporciona más detalles. Dice que el «literal inválido para int() con base 10″ es », que es una cadena vacía. La función int() espera una cadena que represente un número en base 10 (como ‘3’, ’42’, ‘0’, etc.), pero recibió una cadena vacía, que no puede ser interpretada como un número.

¿Por Qué Ocurre el Error?

Este error ocurre porque la función input() devolvió una cadena vacía (posiblemente porque el usuario presionó Enter sin escribir nada), y la función int() no puede convertir una cadena vacía en un número entero.

¿Cómo Prevenir Este Error?

Para prevenir este tipo de error, se pueden implementar verificaciones adicionales para asegurarse de que el dato ingresado sea válido antes de intentar convertirlo en un entero:

7467

En este ejemplo, la función isdigit() se usa para comprobar si la cadena ingresada contiene solo dígitos antes de intentar convertirla en un número entero. Esto ayuda a evitar que se genere un ValueError cuando el usuario introduce datos incorrectos.

También es posible verificar si el tipo de la variable value es un int (Python tiene un medio especial para este tipo de verificaciones: es un operador llamado is. La verificación en sí puede verse así:

7468

El código de toda la función podría ser el siguiente:

7469

La Explicación del Código es la siguiente:
user_input = input(‘Enter a natural number: ‘): Se pide al usuario que ingrese un número natural.

try y except: Utilizamos un bloque try para intentar convertir la entrada a un entero con int(user_input). Si la entrada no es un número válido, se lanza un ValueError y el flujo de ejecución salta al bloque except, donde mostramos un mensaje de error.

if type(value) is int:: Una vez que hemos convertido la entrada a un entero, verificamos que el tipo de la variable value sea int. Este chequeo es redundante aquí porque la conversión con int() ya asegura que el tipo será int si la conversión tiene éxito, pero lo incluimos para cumplir con la instrucción.

Salida correcta: Si la entrada es válida, se calcula el recíproco y se imprime.

Manejo de error: Si la entrada no es válida, el except captura el error y se muestra un mensaje al usuario indicando que debe ingresar un número natural.

Licencia Creative Commons Contenido Web de Yolanda Muriel está sujeto bajo Licencia Creative Commons Atribución-NoComercial-SinDerivadas 3.0 Unported.

Deja un comentario