lunes, 14 de julio de 2025

14 Python 3.13. Excepciones

 ¿Qué es una excepción?

Son un error que ocurre durante la ejecución de un programa.
La sintaxis es correcta, pero durante la ejecución ha ocurrido algo inesperado.
La solución son la captura o control de excepción.
Consiste en decirle al programa, intenta realizar esta operación y si no puedes ejecutar el resto del programa.

En el ejemplo de la imagen vemos como al solicitar la división del número 3 entre 0 nos devuelve una excepción.
Al revisar el código vemos que la sintaxis es correcta.
En Traceback most recent call last: nos indica que la línea 26, contiene la llamada a la función con los parámetros.
Y posteriormente en la línea 12, la función con los parámetros y la operación.
Por último nos lanza la descripción o nombre de la excepción ZeroDivisionError: división by zero.
Y se detiene la ejecución del programa.

Para evitar esto usaremos la cláusula try: except: Nombre de la excepción.
Dentro de la cláusula try: return de nuestra función.
Y dentro de la cláusula except un mensaje o lo que queremos que el programa haga.

Con esto le decimos que intente realizar la operación dentro de la función y si no lo consigue que nos imprima el mensaje que queramos y continue con la ejecución del programa.
Y vemos como el programa se ejecuta en su totalidad, después de imprimir nuestro mensaje de error.
Muy similar a un if else.
Si la excepción que estamos capturando, no es la que el programa comete, el programa caerá igualmente.

Del mismo modo cuando pedimos los valores, estamos solicitando un int, si el valor no es correcto mediante try except podemos controlar esta excepción que se genera.

Si no hemos introducido valores correctos no tiene sentido solicitar una operación a realizar, por lo que hemos de modificar el código.
De lo contrario nos generará un error de tipo NameError pues los valores no están definidos e intenta realizar la operación.

Una solución sería introducir nuestra excepción dentro de un bucle while infinito con un break en el try, y si los valores no son correctos, nos los volverá a solicitar.

Podemos detectar excepciones consecutivas.

- Excepciones anidadas: En el video de estructuras de control de flujo hemos visto un ejemplo.

- Podemos anidar dentro del while las excepciones del ejemplo anterior.

- Con la instrucción Rise podemos lanzar nuestras propias excepciones de forma intencionada.
Esto nos obliga a trabajar con clases POO y con herencia.
Rise permite personalizar el mensaje que se lanza al usuario:
rise TypeError(“Menseja Personalizado”)
rise ValueError(“Menseja Personalizado”)
El tipo de error ha de ser uno de los definidos dentro del las bibliotecas de Python.

Esto puede ser útil por ejemplo cuando intentamos acceder a una bbdd y no es posible…

def multiplica(n1, n2):

                return n1*n2

 def suma(n1, n2):

                return n1+n2

 def resta(n1, n2):

                return n1-n2

 def divide(n1, n2):

                try:

                               return n1/n2

                except ZeroDivisionError:

                               print("No se permiten divisiones entre 0...")

 

while True:

                try:

                               op1=int(input("Numero 1: "))

                               op2=int(input("Numero 2: "))

                               break

                except ValueError:

                               print("Los valores no son correctos...")

                               print("Introducelos de nuevo...")

 oper=input("Operación a realizar (+ - * /) ")

 if oper=="+":

                print(f"La suma de {op1}+{op2} es: {suma(op1, op2)}")

elif oper=="-":

                print(f"La resta de {op1}-{op2} es: {resta(op1, op2)}")

elif oper=="*":

                print(f"La multiplicación de {op1}*{op2} es: {multiplica(op1, op2)}")

elif oper=="/":

                print(f"La división de {op1}/{op2} es: {divide(op1, op2)}")

else:

                print("** Operación no completada **")

 

print("Operación Realizada")

##############

def div():

     while True:

        # Dectectamos excepciones consecutivas.

        try:

            op1=(float(input("Priver valor: ")))

            op2=(float(input("Segundo valor:")))

            print(f"La division de {op1}/{op2} es: {op1/op2}")

            break

        except ValueError:

            print("El valor no es correcto...")

        except ZeroDivisionError:

            print("No se pluede dividir un numero por cero...")

        # Podemos declarar un except general sin el nombre del error, no es recomendable, y capturaría cualquier error...

 

        # Con finally podemos ejecutar siempre un código en concreto.

        finally:

           print("Esto se ejecuta siempre dentro del While...")

 

    print(f"Ha finalizado el cálculo...")

 div()

##############

# EJEMPLO DEL VIDEO DE ESTRUCTURAS DE CONTROL DE FLUJO.

# Cómo saber si el dato introducido es correcto.

# Decimos que input() siempre retorna un string...

Dato=input("Dato: ")

 try:

  # El método int() intenta convertir el valor a entero

  entero = int(Dato)

  print("El dato es un entero.")

# Si no es un entero arroja una Excepción.

except ValueError:

  # El método float() intenta convertir el valor a decimal.

  try:

    float_valor = float(Dato)

    print("El dato es un float.")

  # Arroja otra excepción.

  except ValueError:

    print("El dato es una cadena.")


# Aplicamos esto a nuestro ejemplo...

# De esta forma si sólo queremos enteros...

TuEdad6=input("Tu Edad: ")

 try:

  # El método int() intenta convertir el valor a entero

  entero = int(TuEdad6)

  print("El dato es un entero.")

  if entero>100:

    print("Tienes más de 100 años!!!")

  elif entero<=0:

    print("Aún no has nacido")

  elif entero<18:

    print("Soy menor de edad!!!")

  else:

    print("Soy mayor de edad.")

# Si no es un entero arroja una Excepción.

except ValueError:

  print("Has de introducir un numero entero!!!")

 #############

# PODEMOS ANIDAR LOS TRY DEL EJEMPLO ANTERIOR EN EL WHILE:

def div():

     while True:

        # Dectectamos excepciones consecutivas.

        try:

            op1=(float(input("Priver valor: ")))

            op2=(float(input("Segundo valor:")))

            try:

                print(f"La division de {op1}/{op2} es: {op1/op2}")

                break

            except ZeroDivisionError:

                print("No se pluede dividir un numero por cero...")

        except ValueError:

            print("El valor no es correcto...")

        # Podemos declarar un except general sin el nombre del error, no es recomendable, y capturaría cualquier error...

         # Con finally podemos ejecutar siempre un código en concreto.

        finally:

           print("** Con finally: Esto se ejecuta siempre...")

     print(f"** Ha finalizado el cálculo **")

 div()

 ##############

import math

 num=input("Introduce un número: ")

 def raiz(num):

     if float(num)<0:

        raise ValueError("** Error El Numero Es Negativo...")

    else:

        return math.sqrt(float(num))

 try:

    print(f"La raiz cuadrada de {num} es {raiz(num)}")

except ValueError as ErrorNumeroNegativo:

    print(ErrorNumeroNegativo)

 print("Fin del código...")




No hay comentarios:

Publicar un comentario

Gracias por vuestros aportes.