Translate

jueves, 19 de noviembre de 2020

Excepciones en Python


En código que puede causar que ocurra una excepción se coloca en el bloque try y el manejo de la excepción se implementa en el bloque except. El código en el bloque except solo se ejecutará si el bloque try se encuentra con una excepción. He aquí un ejemplo sencillo:

try:

    file = open('test.txt', 'rb')

except IOError as e:

    print('An IOError occurred. {}'.format(e.args[-1]))

En el ejemplo anterior, estamos manejando solo la excepción IOError.

Podemos usar tres métodos para manejar múltiples excepciones. El primero implica poner todas las excepciones que probablemente ocurran en una tupla. Al igual que:

try:

    file = open('test.txt', 'rb')

except (IOError, EOFError) as e:

    print("An error occurred. {}".format(e.args[-1]))

Otro método consiste en manejar excepciones individuales en bloques de excepción separados. Podemos tener tantos excepto bloques como queramos. Aquí hay un ejemplo:

try:

    file = open('test.txt', 'rb')

except EOFError as e:

    print("An EOF error occurred.")

    raise e

except IOError as e:

    print("An error occurred.")

    raise e

De esta manera, si la excepción no es manejada por el primer bloque except, entonces puede ser manejada por un bloque siguiente, o ninguno en absoluto. Ahora, el último método implica atrapar TODAS las excepciones:

try:

    file = open('test.txt', 'rb')

except Exception as e:

    # Some logging if you want

    raise e

Esto puede ser útil cuando no tiene idea de las excepciones que puede generar su programa. Si solo está buscando capturar todas las ejecuciones, pero en realidad no le importa lo que son, puede incluso excluir la excepción como parte.

Nota: la captura de todas las excepciones puede tener consecuencias no deseadas porque la captura de todas las excepciones también puede detectar las que desea que ocurran; por ejemplo, en muchos programas basados ​​en la línea de comandos, presionar control + c terminará el programa, pero si detecta todas las excepciones, KeyboardInterrupt se detectará como una excepción, por lo que presionar control + c NO terminará el programa.

Envolvemos nuestro código principal en la cláusula try. Después de eso, envolvemos algún código en una cláusula except que se ejecuta si ocurre una excepción en el código envuelto en la cláusula try. En este ejemplo también usaremos una tercera cláusula que es la cláusula finally. El código que está envuelto en la cláusula finally se ejecutará tanto si se produjo una excepción como si no. Podría usarse para realizar una limpieza después de un script. He aquí un ejemplo sencillo:

try:

    file = open('test.txt', 'rb')

except IOError as e:

    print('An IOError occurred. {}'.format(e.args[-1]))

finally:

    print("This would be printed whether or not an exception occurred!")


# Output: An IOError occurred. No such file or directory

# This would be printed whether or not an exception occurred!

A menudo, es posible que deseemos que se ejecute algún código si no se produce ninguna excepción. Esto se puede lograr fácilmente utilizando una cláusula else. Uno podría preguntarse: ¿por qué, si solo desea que se ejecute algún código si no ocurre ninguna excepción, no simplemente pondría ese código dentro del intento? La respuesta es que entonces cualquier excepción en ese código será detectada por el intento, y es posible que no desee eso. La mayoría de la gente no lo usa. Aquí hay un ejemplo:

try:

    print('I am sure no exception is going to occur!')

except Exception:

    print('exception')

else:

    # any code that should only run if no exception occurs in the try,

    # but for which exceptions should NOT be caught

    print('This would only run if no exception occurs. And an error here '

          'would NOT be caught.')

finally:

    print('This would be printed in every case.')


# Output: I am sure no exception is going to occur!

# This would only run if no exception occurs. And an error here would NOT be caught

# This would be printed in every case.

La cláusula else solo se ejecutará si no se produce ninguna excepción y se ejecutará antes de la cláusula finalmente.