Hasta ahora es común que nuestros programas en Python hayan podido tener errores, es normal pues apenas estamos aprendiendo; puede que al realizar alguna práctica o resolviendo un ejercicio te haya pasado más de una vez que, al copilar, te salga un error, por ejemplo algo del estilo
print(2 / 0)
--------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) <ipython-input-1-8b4ac6d3a3e1> in <module> ----> 1 2 / 0 ZeroDivisionError: division by zero
Los principales tipos de errores o excepciones en Python son:
TypeError
: Ocurre cuando se aplica una operación o función a un dato del tipo inapropiado.ZeroDivisionError
: Ocurre cuando se itenta dividir por cero.OverflowError
: Ocurre cuando un cálculo excede el límite para un tipo de dato numérico.IndexError
: Ocurre cuando se intenta acceder a una secuencia con un índice que no existe.KeyError
: Ocurre cuando se intenta acceder a un diccionario con una clave que no existe.FileNotFoundError
: Ocurre cuando se intenta acceder a un fichero que no existe en la ruta indicada.ImportError
: Ocurre cuando falla la importación de un módulo.Si bien el condicional if
nos permite cierto manejo respecto a los errores, por ejemplo
x = 0
if x == 0:
print(f'No se pueden realizar divisiones por cero')
else:
print(2 / x)
No se pueden realizar divisiones por cero
tenemos el manejo de excepciones que nos da un mejor control sobre ellos. De tal manera, hay una estructura de control para la detección y tratamiento de errores (o excepciones): try-except. Su sintaxis básica es
try:
# Acción potencialmente errónea
# Acción potencialmente errónea
# Acción potencialmente errónea
# .
# .
except:
# acción para tratar el error
# acción para tratar el error
# acción para tratar el error
# .
# .
que básicamente funciona como: intenta ejecutar estas acciones (referentes al try
) y si se comente un error ejecuta inmediatamente estas otras acciones (referentes al except
). Por ejemplo
a = int(input("¿Cuál es el valor de a?"))
b = int(input("¿Cuál es el valor de b?"))
try:
print(a / b)
except ZeroDivisionError:
print("No se puede dividir entre cero")
¿Cuál es el valor de a?1 ¿Cuál es el valor de b?0 No se puede dividir entre cero
Notemos que después de except
hemos colocado el error o excepción del tipo ZeroDivisionError pues sabemos de antemano que el error que pueda presentarse en el try
es de este tipo.
Otro ejemplo, cuando hicimos una calculadora para hallar las soluciones de una ecuación de segundo grado en la Práctica 3, podemos implementar un tratamiento de excepciones para cuando el discriminante de la ecuación sea menor a cero (lo que desencadena en calcular raíces cuadradas de números negativos y así caer en un error dentro de Python).
Dado que puede ocurrir que intentemos calcular raíces cuadradas de números negativos, colocaremos la expresión correspondiente a la fórmula general dentro de las acciones del try
para que se ejecuten siempre y cuando no estemos calculando raíces cuadradas de números negativos, es decir, dentro de éste se estarán calculando las soluciones para las ecuaciones cuadráticas cuyo discriminante es mayor o igual a 0.
Si dentro del try
se presenta un error, entonces ejecutaremos inmediatamente las acciones dentro del except
las cuales se encargarán de calcular las soluciones para ecuaciones de segundo grado cuyo discriminante es menor a cero. Dentro de éste implementaremos el código como lo hicimos en la Práctica 3
import math
# Declaramos los valores para identificar la ecuación cuadrática
a = 1; b = 0; c = 1
# Realizamos el tratamiento de excepciones
try:
x1 = ( -b + math.sqrt(b ** 2 - 4 * a * c) ) / 2 * a
x2 = ( -b - math.sqrt(b ** 2 - 4 * a * c) ) / 2 * a
print(f'Solución 1: {x1}')
print(f'Solución 2: {x2}')
except ValueError:
parte_real = -b / 2 * a
parte_imag = ( math.sqrt( abs(b ** 2 - 4 * a * c) ) ) / 2 * a
x1 = complex(parte_real, parte_imag)
x2 = complex(parte_real, -parte_imag)
print(f'Solución 1: {x1}')
print(f'Solución 2: {x2}')
Solución 1: 1j Solución 2: -1j
el cual tiene menos líneas que el empleado en la práctica 3 y además es más intuitivo sobre el manejo de los posibles errores pues estamos siendo más precisos en el tipo de error o excepción que puede presentarse.
La excepción ValueError es un error referente al dominio matemático. Si consideramos la función $f(x)=\sqrt{x}$, el dominio de $f$ es el intervalo $[0,\infty)$, por lo que ingresar valores fuera de este intervalo no está permitido. En otras palabras, no es posible efectuar raíces cuadradas de números negativos:
print(math.sqrt(-4))
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-13-631978d080a3> in <module> ----> 1 print(math.sqrt(-4)) ValueError: math domain error