Error de valor en Python
Entre todos los tipos de errores en tiempo de ejecución que podemos encontrar al programar en Python, los errores de valor son uno de los más comunes.
ValueError
El error de valor o "ValueError" es un tipo de error que se produce cuando una función recibe un argumento con un valor que no es válido.
El ejemplo más común y más claro es el proceso de ingreso de datos por parte del usuario.
Durante la ejecución de un programa, los usuarios pueden ingresar datos incorrectos o inesperados. Por lo tanto, es mejor que nuestros programas estén preparados, de manera defensiva, para adaptarse a estos datos ingresados, que generalmente estarán bien, pero también podrían estar mal.
Ilustremos esto con un ejemplo simple:
# Solicitar al usuario un número entero
# input siempre devuelve una cadena de caracteres.
# Por lo tanto es necesario convertir la cadena a un número entero con la función int()
numero = int(input("Ingrese un número entero: "))
# Imprimir el número ingresado utilizando f-strings
print(f"El número ingresado es: {numero}")
El programa parece estar correcto. Probemos:
En este caso, si el usuario ingresa un número entero, el programa funcionará correctamente.
¡Buena práctica!
Cuando pruebas tu código, o el código de alguien más, es una buena práctica "testear" casos especiales. Si hablamos de números como en este caso: - números que no sean tan claros como 17 o 21. - El 0, un número interesante desde lo matemático. - Números negativos también
De esta manera, puedes asegurarte de que tu programa maneje correctamente estos casos especiales.
Y también es una buena práctica probar con valores que no sean los esperados para ver cómo se comporta tu programa.
Si ponemos en práctica nuestro consejo de arriba, ¿qué podría salir mal cuando el usuario interactúe con el programa? ¿Por qué este programa no está escrito correctamente?
Piensa por un instante y luego haz clic aquí para ver la respuesta
El problema con este programa es que no está preparado para manejar errores de valor. Si el usuario ingresa un valor que no es convertible a un número entero, el programa generará un error de tiempo de ejecución, es decir, un error de valor y se detendrá.
Este no es un error de sintaxis, porque no se genera por cometer un error tipográfico al escribir la sintaxis del programa. Si no que es producto de la manipulación de un valor durante la ejecución de dicho programa.
Ingrese un número entero: hola
Traceback (most recent call last):
File "c:\Usuarios\pablo\runtimeError.py", line 1, in <module>
numero = int(input("Ingrese un número entero: "))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'hola'
En este caso, el error se produce porque la función
int()
espera un valor que pueda convertir en número entero, pero recibe una cadena de caracteres en su lugar.Esto provoca un error de valor y el programa no se puede ejecutar.
Definición
Un error de valor es un problema que se produce cuando una función recibe un argumento con un valor que no es válido.
Concentrémonos en el mensaje de error:
Este es el punto más importante. Es donde se indica el tipo de error: ValueError, error de valor. Algo no está bien con el valor que se intenta convertir.
Y a continuación brinda más detalles: "_invalid literal for int() with base 10: 'hola'". En este caso, nos informa que el valor hola
no es válido para la función int()
. Desglosemos el error:
invalid literal for int()
: literal inválido paraint()
. La funciónint()
espera un valor que pueda convertir en número entero, pero recibe una cadena de caracteres en su lugar.with base 10
: con base 10. La base 10 es la base numérica que utilizamos en nuestra vida diaria y la que utiliza Python. Es decir, el sistema decimal.'hola'
: el valor que se intenta convertir. Es un literal de cadena de caracteres que no puede ser convertido a un número entero.
Recuerda que las flechas ^
apuntan al lugar exacto donde el intérprete de Python detectó el error.
¿Qué es un literal?
Un literal es un valor que se ha escrito directamente en el código fuente. Por ejemplo, 10
es un literal entero, 3.14
es un literal de punto flotante y "hola"
es un literal de cadena de texto.
¡Para recordar!
En Python y en muchos lenguajes de programación, los mensajes de error están escritos para programadores que se sienten cómodos con ellos. Y, por supuesto, cuando estás aprendiendo programación, es posible que no te sientas tan cómodo con el lenguaje de programación, y mucho menos con los mensajes de error.
Resolviendo errores de valor
¿Cómo podríamos solucionar estos errores? Resulta que podríamos simplemente agregar líneas de código, instrucciones precisas de control y prevención, a mi programa.
Una solución sería informar al usuario que debe ingresar un número entero de una manera bien explícita:
# Solicitar al usuario un número entero y que preste atención para no escribir un texto
# input siempre devuelve una cadena de caracteres.
# Por lo tanto es necesario convertir la cadena a un número entero con la función int()
numero = int(input("Ingrese un número entero. ¡Qué no sea un texto por favor!: "))
# Imprimir el número ingresado utilizando f-strings
print(f"El número ingresado es: {numero}")
Esta es una pésima y pobre solución. El usuario podría no prestar atención y escribir un texto de todas maneras. O peor, podría escribir algo malicioso para hacer que el programa se bloquee.
¡Para recordar!
No es una buena práctica simplemente pedirle al usuario que no haga algo.
Recuerda que cuando desarrollas la solución a un problema, debes tener en cuenta que los usuarios no siempre seguirán las instrucciones, por el motivo que sea. Por lo tanto, debes escribir tu código de manera defensiva, teniendo en cuenta que los usuarios podrán y van a cometer errores.
¡Siempre debes pensar en el peor escenario posible! ¡Y preparar tu programa para que esté listo para manejarlo!
Escribe tu código teniendo en cuenta el manejo de errores.
¡Buena práctica!
Escribe programas cuyas líneas de código no solo resuelvan el problema para el cual fueron desarrolladas, sino que también gestionen todos los errores que puedan ocurrir inesperadamente durante su ejecución.
A mayor cantidad de errores que puedas prever y gestionar, mejor será tu programa.
¡Veamos como hacerlo!