Lanzar excepciones
En apartados anteriores vimos que dentro de las funciones podían producirse errores y que estos se podían controlar mediante captura de excepciones. En este capítulo veremos cómo se indica dentro de una función que se produjo un error. Esto se conoce como lanzar una excepción.
La declaración raise permite al programador forzar que ocurra una excepción específica.
Imaginemos que creamos una función que calcula la raíz cuadrada de un número que se pasa como argumento. Si el número proporcionado es un número negativo, podemos lanzar una excepción de tipo ValueError. Ejemplo:
def raiz_cuadrada(numero):
"""
Calcula la raíz cuadrada de un número
Args:
numero (int): el número del que se realiza la raíz cuadrada
Returns:
float: el valor de la raíz cuadrada
Raises:
ValueError: Si los valores introducidos no son números positivos
"""
if numero < 0:
raise ValueError
else:
return numero ** 1/2
Las excepciones que una función o método puede lanzar se pueden documentar dentro del docstring utilizando la etiqueta Raises.
En Python, siempre que implementemos una función, deberemos realizar siempre las siguientes comprobaciones en las primeras líneas de código y en el siguiente orden:
- Comprobar tipo de datos de los parámetros. Debemos comprobar que los parámetros que recibimos son válidos. En caso contrario, lanzaremos una excepción de tipo
TypeError. Por ejemplo, tenemos una función que calcula el precio con IVA de un producto a partir del precio sin él que se nos pasa por parámetro. Si este precio no es un número (es decir, uninto unfloat) lanzaremos la excepciónTypeError. - Comprobar que los valores de los parámetros son válidos. También tendremos que comprobar que los valores que se pasan por parámetros sean adecuados para poder realizar las operaciones necesarias. En caso de que no lo sean, lanzaremos una excepción
ValueError. Consideremos el caso del ejemplo anterior: si el precio que se nos pasa por parámetro es negativo, como un precio siempre debe ser positivo, lanzaremos una excepciónValueError.
Una vez que se ejecuta una sentencia raise, termina la ejecución de la función, por lo que no se ejecutan más sentencias de la función. Si en el programa principal no se captura dicha excepción cuando se hace la llamada a la función, el programa terminará indicando el error cometido si se llega a lanzar la excepción.
Por lo tanto, cuando se realiza una función que lanza algún tipo de excepción, debe indicarse en los comentarios y documentación de la función.
Si no queremos indicar ninguna excepción particular, podemos utilizar la excepción Exception.