https://mapecode.com/excepciones-en-python/
Qué es una excepción en Python
Los errores en tiempo de ejecución se denominan excepciones, incluso si la declaración o expresión es sintácticamente correcta, puede generar un error cuando se intenta ejecutarla.
Un ejemplo de excepción es la división entre 0, como se muestra a continuación:
10 * (1/0)
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
ZeroDivisionError: division by zero
El mensaje mostrado se puede dividir en lo siguiente:
La última línea de los mensajes de error indica qué sucedió.
La cadena mostrada como tipo de la excepción es el nombre de la excepción predefinida que ocurrió.
El resto de la línea provee un detalle basado en el tipo de la excepción y qué la causó.
La lista detallada de excepciones definidas en Python puedes verla aquí.
¿Cuál es la diferencia entre un error de sintaxis y un excepción? Pues un error de sintaxis es un uso incorrecto del lenguaje, es decir, expresar de forma incorrecta una estructura.
En cambio, una excepción se produce cuando el programa se esta ejecutando. Por ejemplo si pedimos por teclado un número entero y realizamos una operación sin convertir la cadena recibida en un número se producirá una excepción. (Puedes verlo en este post)
Controlar excepciones en Python
En Python, al igual que otros lenguajes como Java es posible controlar excepciones, para que el programa este preparado y ejecute unas instrucciones concretas cuando se produzcan excepciones.
En el siguiente código estamos viendo de forma práctica el ejemplo anterior, leer por teclado un número entero controlando la posible excepción ValueError:
while True:
try:
x = int(input("Por favor ingrese un número \n> "))
break
except ValueError:
print(“Oops! No era válido. Intente nuevamente \n>”)
Una versión recursiva de este código puedes verla en la siguiente publicación:
Cómo funciona la estructura try-except en Python
La declaración try funciona de la siguiente manera:
Se ejecuta el bloque try (el código entre las declaración try y except).
Si no ocurre ninguna excepción, el bloque except no se ejecuta y termina la ejecución de la declaración try.
Si se produce una excepción durante la ejecución del bloque try, el resto del bloque no se ejecuta y se produce lo siguiente:
El tipo coincide con la excepción nombrada junto a la palabra reservada except, se ejecuta el bloque except, y la ejecución continúa después de la declaración try.
El tipo no coincide con la excepción nombrada en el except, esta se pasa a declaraciones try de más afuera. En caso de que, no se encuentra nada que la maneje, es una excepción no manejada, y la ejecución finaliza con un mensaje de error.
Controlar varias excepciones con except en Python
Una declaración try puede tener más de un except, para especificar manejadores para distintas excepciones, pero solo uno de ellos será ejecutado.
Un except también puede nombrar múltiples excepciones usando paréntesis, como por ejemplo:
try:
pass
except (RuntimeError, ValueError, NameError):
pass
Manejar todas las excepciones a la vez en Python
Al igual que un except puede nombrar específicamente que excepciones manejar, también puede no nombrar ninguna de forma específica, consiguiendo que se manejen todas, es decir, cualquier excepción que se produzca en el try se manejará, como se muestra a continuación:
try:
pass
except:
pass
Bloque else controlando excepciones en Python
Las declaraciones try-except tienen un bloque else opcional, el cual, cuando está presente, debe estar declarado a continuación a los except.
Este bloque es útil para aquel código que debe ejecutarse si el bloque try no genera una excepción.
try:
pass
except:
pass
else:
pass
Generar instancia con except en Python
El except puede especificar una variable después del nombre de excepción. La variable se vincula a una instancia de excepción con los argumentos almacenados en instance.args.
La instancia de excepción define cómo str() para que se pueda mostrar los argumentos directamente, sin necesidad de hacer referencia a .args.
try:
pass
except ValueError as inst:
pass
else:
pass
RECOMENDADO ➡️ Ejecutar comandos en Python
Lanzar excepciones en Python
La declaración raise permite al programador forzar que ocurra una excepción específica. Por ejemplo:
raise NameError(‘Problema’)
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
NameError: Problema
El único argumento a raise indica la excepción que se generará. Tiene que ser una instancia de excepción o una clase que hereda de Exception .
Si se pasa una clase de excepción sin argumentos, la misma será instanciada implícitamente llamando a su constructor sin argumentos:
raise ValueError # Equivalente a 'raise ValueError()'
RECOMENDADO ➡️ Continue en Python
Definir excepciones en Python
Los programas pueden nombrar sus propias excepciones creando una nueva clase que herede de Exception.
Las clases de Excepciones se pueden definir de la misma forma que cualquier otra clase, pero normalmente son simples, a menudo ofreciendo solo un número de atributos con información sobre el error que leerá al manejar la excepción.
Al crear un módulo que puede lanzar distintos errores, una práctica común es crear una clase base para excepciones definidas en ese módulo y extenderla para crear clases excepciones específicas para distintas situaciones de error (más información aquí).
Ejemplo definiendo excepciones
Vamos a hacer un ejemplo en el que se quiere controlar la paridad de un número introducido por teclado. Para ello se definen las siguientes excepciones:
class Error(Exception): # Hereda de Exception
""“Clase base para excepciones en el módulo.”"“
pass
class parityError(Error): # Hereda de Error
”"“Excepción lanzada por errores cuando un numero no tiene
la paridad que deseamos. La paridad de un número entero se
refiere a su atributo de ser par o impar.
Atributos:
num – numero por el que ocurre el error
mensaje – explicación del error
”""
def init(self, num, mensaje):
self.num = num
self.mensaje = mensaje
La clase Error se crea por convenio, cómo hemos comentado antes, pero podríamos crear directamente la clase de nuestra excepción que heredará de Exception.
La idea con la excepción creada es que la lancemos cuando detectemos un número con la paridad que no deseamos (La paridad de un número entero se refiere a su atributo de ser par o impar), como en el siguiente código:
try:
n = int(input("Introduzca un numero entero \n> "))
if n % 2 != 0:
raise parityError(n,‘El numero es impar’)
except ValueError:
print(“No se ha introducido un numero”)
En este caso lo que se quiere es un número par, con lo cual si el número es impar (el resto de dividir el número entre dos es distinto de 0) lanzamos la excepción.
RECOMENDADO ➡️ Ordenar lista de enteros en Python
Cláusula finally en Python
La declaración try tiene otra cláusula opcional (finally) que intenta definir acciones de limpieza que deben ser ejecutadas bajo ciertas circunstancias. Por ejemplo:
try:
… raise KeyboardInterrupt
… finally:
… print(‘Fin’)
…
Fin
KeyboardInterrupt
Traceback (most recent call last):
File “<stdin>”, line 2, in ?
Una cláusula finally siempre es ejecutada antes de salir de la declaración try, ya sea cuando una excepción haya ocurrido o no.
Cuando ocurre una excepción en la cláusula try y no fue manejada por una cláusula except (o ocurrió en una cláusula except o else), es relanzada luego de que se ejecuta la cláusula finally.
El finally es también ejecutado “a la salida” de cualquier otra cláusula de la declaración try siendo dejada via break, continue or return.
Espero que haya resultado de utilidad este artículo sobre las excepciones en Python, cualquier duda puedes hacerla en la sección de comentarios y estaré encantado de responderla 🙂