¿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()
##############
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.