es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ayuda para principiantes de Python: gestión de errores de entrada.

Acabo de empezar a aprender Python y estoy intentando manejar los errores que un usuario podría introducir. Todo lo que hace el programa es utilizar el módulo math, pedir al usuario un número entero y devolver el factorial del número.

Estoy intentando capturar errores para números negativos, números decimales y texto.

Si introduzco un número entero, el código funciona correctamente.

Cuando introduzco un valor incorrecto, como -9 o manzana, el try / except parece no capturar el error y obtengo información de seguimiento. El usuario no debería ver esto.

¿Alguna sugerencia o consejo?

importar math desde datetime import datetime importar tiempo

num = 0 inicio = 0 fin = 0
#El valor máximo es 2147483647
#si name == ‘main’:
tratar:
num = input(“Introduce un número: “)
excepto OverflowError:
print(“La entrada no puede superar los 2147483647”)
excepto ValueError:
print(“Introduce un número entero no negativo”)
excepto NameError:
print(“Debe ser un número entero”)
más:
inicio = datetime.now()
print(“El factorial de “, num, “es : “)
print(math.factorial(int(num)))
fin = datetime.now()
print(f”Tiempo tomado en (hh:mm:ss.ms) es {fin – inicio}”)

Estoy usando Python 3.10 en un PC Windows 10 Pro (64-bit) si importa.

Norman

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para manejar errores para números negativos, decimales y textos, se puede utilizar el bloque try/except. Sin embargo, en su código actual, solo está capturando excepciones específicas (OverflowError, ValueError y NameError) que podrían no cubrir todos los posibles errores para los valores de entrada. Para capturar los errores para números negativos y decimales, se puede utilizar el método float() en lugar del método input(), y luego verificar si el valor es un número entero utilizando el método is_integer(). Aquí hay un fragmento de código actualizado que incorpora estos cambios:

    import math
    from datetime import datetime
    
    inicio = 0
    final = 0
    
    try:
        num = float(input("Ingrese un número entero no negativo: "))
        if not num.is_integer() or num < 0:
            raise ValueError
    except ValueError:
        print("Por favor ingrese un número entero no negativo")
    else:
        inicio = datetime.now()
        print("El factorial de", int(num), "es:")
        print(math.factorial(int(num)))
        final = datetime.now()
        print(f"Tiempo transcurrido (hh:mm:ss.ms): {final - inicio}")
    

    Este código primero intenta convertir el valor de entrada en un número decimal, y si falla o el valor no es un número entero no negativo, el código genera una excepción ValueError. De lo contrario, el código convierte la entrada decimal en un valor entero y calcula el factorial. Si el código tiene éxito, imprime el factorial y el tiempo que llevó calcularlo.

    Con este código actualizado, si el usuario ingresa un valor de entrada no válido, el código capturará el error e imprimirá un mensaje de error amigable para el usuario en lugar de la información de la traceback.

Comments are closed.