Python3: Manejo de Excepciones
Un error no es una excepción
Si bien un error puede lanzar una excepción, este se da en ciertas condiciones tales como errores de compilación, errores de sintaxis, errores de lógica en el código, incompatibilidad de librerías, recursión infinita, etc.
Los errores escapan del control de los programadores y no tiene ningún sentido tratar de manejarlos.
En cambio, una excepción puede ser manejada por el programador.
Exceptions
Cada vez que ocurre un error en runtime (tiempo de ejecución), Python genera un objeto exception.
Si la excepción no es manejada apropiada mente el programa se cerrará y se mostrará en consola un Traceback hacia ese error.
Built-in Exceptions
Python posee gran cantidad de excepciones para cada situación como por ejemplo:
Además podemos crear custom exceptions heredando de la clase Exception para cumplir con nuestro requerimiento.
class CustomError(Exception):
...
pass
try:
...
except CustomError:
...
Exception Handling
Bloque try y except
Para evitar que nuestro programa se detenga cuando hay un error, debemos manejar correctamente las excepciones mediante un bloque try...except.
try:
print("Todo está bien")
except:
print("Una excepción ocurrió")
También podemos manejar múltiples exceptions:
try:
even_numbers = [2,4,6,8]
print(even_numbers[5])
except ZeroDivisionError:
print("Denominator cannot be 0.")
except IndexError:
print("Index Out of Bound.")
# Output: Index Out of Bound
En el ejemplo de arriba gracias a programiz, se esperan errores de división por cero y de índice. Dado que dentro del bloque try se intenta acceder a un índice que no existe en la variable even_numbers, lanzará un error de IndexError y entrará en el except IndexError.
Recomendado por LinkedIn
Bloque Else
El bloque else se cumple solo si try se ha ejecutado sin errores.
# programa para validar si un número es par o no
try:
num = int(input("Ingresa un número: "))
assert num % 2 == 0
except:
print("No es un número par")
else:
print("Es par:", num)
Bloque Finally
El bloque finally, se ejecutará independientemente de si el bloque try genera un error o no.
# programa para validar si un número es par o no
try:
num = int(input("Ingresa un número: "))
assert num % 2 == 0
except:
print("No es un número par")
else:
print("Es par:", num)
finally:
print("Fin del programa")
En el siguiente ejemplo gracias a W3schools podemos ver que podemos usar bloques try...except dentro de otro bloque try...except, y describe muy bien la utilidad de finally:
try:
f = open("demofile.txt")
try:
f.write("Lorum Ipsum")
except:
print("Something went wrong when writing to the file")
finally:
f.close()
except:
print("Something went wrong when opening the file")
En el ejemplo se intenta escribir sobre un archivo y manejamos los posibles errores de lectura y escritura, además de cerrar el objeto en el bloque finally habiendo o no encontrado un error de escritura.
Raise Exception
Podemos lanzar excepciones mediante la sentencia raise de acuerdo a nuestras necesidades.
edad = 16
if edad < 18:
raise Exception("Edad no permitida. La edad mínima es 18.")
Y recuerda que podemos lanzar las diferentes built-in exceptions de python así como custom exceptions:
raise TypeError("Solo está permitido números enteros")
raise NotAllowedCountry("País sin cobertura")
Próximos temas a trater según el roadmap:
Fuentes: