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.