Errores y Excepciones en Python

El manejo de Errores y Excepciones en Python es uno de los temas más importantes. Un bloque de código de manejo de excepciones típico tendrá la siguiente forma:

» Más ejemplos de Python

    try:
        #Código con posible Excepción
    except ValueError:
        #Exception Handling

Quizá algunos de los errores que con mayor frecuencia encontrarás, son los errores de sintaxis, conocidos también como errores de interpretación, y son quizá el tipo de error más común cuando estás aprendiendo el lenguaje. Si ejecutas las siguientes líneas de código en el interprete obtendrás un Error de Sintaxis o un SintaxError: invalid syntax:

>>> i = 0
>>> if i < 5 print('i es menor que 5')
  File "<stdin>", line 1
    if i < 5 print('i es menor que 5')
             ^
SyntaxError: invalid syntax
>>>

Y es porque simplemente ha hecho falta poner dos puntos después del If. Errores como este son típicos y es muy útil que Python te alerte y te indique la posición donde han ocurrido con una pequeña flecha.

Sin embargo, no todos los errores que existen serán de sintaxis, también existen las Excepciones.

Excepciones

Es muy probable que aún teniendo escrito todo correctamente puedan surgir Excepciones durante la ejecución de nuestro programa, ya que muchas veces los datos de entrada varían y su valor puede no ser el esperado. Veamos algunos ejemplos:

>>> 100 * (200/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

Hemos obtenido una ZeroDivisionError por una división por cero.

>>> 5 + variable_sin_definir * 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'variable_sin_definir' is not defined

Obtenemos un NameError por una variable no definida previamente.

>>> 'suma_total' + 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

Un TypeError por un mal manejo del operador «+» al tratar de concatenar cadenas con un entero.

Las Excepciones pueden detener la ejecución de tu programa pero esto no tiene que ser así necesariamente, a continuación veremos como manejarlas.

En el siguiente ejemplo vemos la estructura típica más elaborada de un Bloque de manejo de Excepciones.

Errores y Excepciones en Python
Ejemplo de Errores y Excepciones en Python

En este bloque, puedes ver una sentencia try, que es la forma en la que indicamos que vamos a manejar una potencial excepción.

Si el código contenido dentro del bloque try lanza una excepción, esta será manejada con el código en «except«.

Si no ocurre ninguna excepción, se omite la ejecución de nuestro bloque except.

Si ocurre una Excepción que no está incluida en nuestra sentencia except, tendremos una unhandled exception, que puede detener la ejecución del programa, puedes usar más de un except.

Si hacemos la ejecución del ejemplo en el interprete obtendremos el siguiente comportamiento:

>>> while True:
...     try:
...         x = int(input("Introduzca un número: "))
...         break
...     except ValueError:
...         print("No es un numero válido, por favor intenta de nuevo.")
...
Introduzca un número: Hola
No es un numero válido, por favor intenta de nuevo.
Introduzca un número: 2
>>>

Como mencionamos anteriormente, es posible manejar más de una excepción, agregando tantas sentencias except, como sean necesarias.

import sys

try:
    f = open('archivo.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("No es posible convertir esta cadena a entero")
except:
    print("Error inesperado:", sys.exc_info()[0])
    raise

En el ejemplo anterior, vemos que también podemos hacer uso de la sentencia except como comodín, cuando no conocemos el error o excepción de forma específica.

Lanzar tus propias Excepciones

Es posible que tu quieras lanzar tus propias excepciones, para hacerlo, puedes usar la sentencia raise. Por ejemplo:

>>> raise NameError('Error inesperado')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: HiThere

Tu puedes crear tus propias Excepciones, estas son clases que heredan de Exception y simplemente debes invocar a raise como sigue:

raise OperacionError #Suponiendo que la declaras en otro lado

Finalmente, el manejo de Errores y Excepciones en Python es esencial y debes aplicarlo siempre que consideres que es importante controlar la ejecución y flujo de tu programa para que este no se detenga de forma inesperada.

Más información en la pagina oficial: https://docs.python.org/3/tutorial/errors.html

Más información en inglés: https://geekole.com/errors-and-exceptions-in-python/