Manejo de excepciones en Python

Ahora mismo, obtener un error, o una excepción, en tu programa Python significa que todo el programa se colgará. No quieres que esto ocurra en los programas del mundo real. En su lugar, quieres que el programa detecte los errores, los maneje y luego continúe ejecutándose.

Por ejemplo, considere el siguiente programa, que tiene un error de división por cero. Abre una ventana del editor de archivos e introduce el siguiente código, guardándolo como zeroDivide.py:

def spam(divideBy):
    return 42 / divideBy

print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))

Hemos definido una función llamada spam, le hemos dado un parámetro y luego hemos imprimido el valor de esa función con varios argumentos para ver qué pasa. Esta es la salida que se obtiene al ejecutar el código anterior:

21.0
3.5
Traceback (most recent call last):
  File "C:/zeroDivide.py", line 6, in <module>
    print(spam(0))
  File "C:/zeroDivide.py", line 2, in spam
    return 42 / divideBy
ZeroDivisionError: division by zero

Puedes ver la ejecución de este programa en https://autbor.com/zerodivide/. Un ZeroDivisionError ocurre siempre que se intenta dividir un número por cero. Por el número de línea que aparece en el mensaje de error, sabes que la sentencia return de spam() está causando un error.

Los errores pueden ser manejados con sentencias try y except. El código que podría tener un error se pone en una cláusula try. La ejecución del programa se mueve al inicio de una cláusula except siguiente si ocurre un error.

Puedes poner el código anterior de dividir por cero en una cláusula try y hacer que una cláusula except contenga código para manejar lo que ocurre cuando este error ocurre.

def spam(divideBy):
    try:
        return 42 / divideBy
    except ZeroDivisionError:
        print('Error: Invalid argument.')

print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))

Cuando el código de una cláusula try provoca un error, la ejecución del programa pasa inmediatamente al código de la cláusula except. Después de ejecutar ese código, la ejecución continúa de forma normal. La salida del programa anterior es la siguiente:

21.0
3.5
Error: Invalid argument.
None
42.0

Puede ver la ejecución de este programa en https://autbor.com/tryexceptzerodivide/. Tenga en cuenta que cualquier error que se produzca en las llamadas a funciones en un bloque try también será capturado. Considera el siguiente programa, que en cambio tiene las llamadas a spam() en el bloque try:

def spam(divideBy):
    return 42 / divideBy

try:
    print(spam(2))
    print(spam(12))
    print(spam(0))
    print(spam(1))
except ZeroDivisionError:
    print('Error: Invalid argument.')

Cuando se ejecuta este programa, la salida tiene el siguiente aspecto:

21.0
3.5
Error: Invalid argument.

Puedes ver la ejecución de este programa en https://autbor.com/spamintry/. La razón por la que print(spam(1)) nunca se ejecuta es porque una vez que la ejecución salta al código de la cláusula except, no vuelve a la cláusula try. En su lugar, continúa avanzando por el programa de forma normal.

Deja una respuesta