Gestión de Errores

El mecanismo estándar para detectar y notificar errores son las escepciones.


In [2]:
1/0


---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-2-74761e64c712> in <module>()
----> 1 1/0

ZeroDivisionError: integer division or modulo by zero

Incluso los errores sintácticos o la utilización de símbolos no definidos se notifica mediante excepciones:


In [15]:
missing_function()


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-15-365b2f2e68d2> in <module>()
----> 1 missing_function()

NameError: name 'missing_function' is not defined

Capturando excepciones

Se puede capturar una excepción para decidir qué hacer en esa situación. Para hacer la captura se utiliza el la construcción try ... except:


In [8]:
try:
    1/0
except ZeroDivisionError as e:
    print("Exception raised: '{}'".format(e))


Exception raised: 'integer division or modulo by zero'

Es posible capturar todas las excepciones si se utiliza "except:", pero es algo que se debe evitar porque inadvertidamente se pueden ocultar problemas que después serán difíciles de localizar.

Lanzando excepciones

El programador puede utilizar cualquier excepción definida con la clausula raise:


In [2]:
def raising_exception(a):
    if a > 3:
        raise IndexError()
        
raising_exception(20)


---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-2-29160d1b8421> in <module>()
      3         raise IndexError()
      4 
----> 5 raising_exception(20)

<ipython-input-2-29160d1b8421> in raising_exception(a)
      1 def raising_exception(a):
      2     if a > 3:
----> 3         raise IndexError()
      4 
      5 raising_exception(20)

IndexError: 

Definiendo excepciones

Aunque lo habitual es crear excepciones específicas que identifican problemas propios del dominio del problema. Las excepciones son clases que debería heredar de la clase Exception:


In [3]:
class MyException(Exception):
    pass

raise MyException()


---------------------------------------------------------------------------
MyException                               Traceback (most recent call last)
<ipython-input-3-ff8953b12a69> in <module>()
      2     pass
      3 
----> 4 raise MyException()

MyException: