Cómo manejar excepciones en Python

El manejo de excepciones es su capacidad para personalizar y mostrar mensajes de error para partes de su programa que no funcionan.

Ya sea que esté creando un sitio web, haciendo una API, un módulo o cualquier otro producto usando Python, su capacidad para manejar de manera efectiva las excepciones le permite indicar explícitamente la causa de un error.

Aquí, veremos cómo puede manejar las excepciones en Python.

Cómo funciona el manejo de excepciones en Python

Cuando genera excepciones, le está diciendo a Python que muestre un mensaje cada vez que falla un bloque de código. El manejo de excepciones es como decirle a alguien que intente levantar un peso. Y si no pueden, deberían avisarle.

Sin embargo, para generar una excepción en Python, le indicará a Python que intente ejecutar un bloque de código en particular. Si ese bloque falla, puede pedirle a Python que genere una excepción definida al código fallido.

¿Cuándo debería utilizar excepciones en la programación de Python?

En la mayoría de las ocasiones, puede enmascarar los errores estándar de Python mediante excepciones. Pero debe permanecer atento, ya que hacer esto puede causar problemas de depuración. En consecuencia, es posible que le resulte difícil averiguar la causa raíz de un eventual error.

Por lo tanto, debe usar excepciones cuando haya probado suficientemente su código y esté seguro de que funciona. En última instancia, es una buena práctica usarlos para manejar fallas potenciales que pueden surgir del usuario final en lugar del código en sí.

En otras palabras, puede usar las excepciones como una herramienta de advertencia para guiar a los usuarios sobre cómo usar su programa.

Manejo de excepciones de Python

Para manejar excepciones en Python, primero debe ajustar su código en un intento … excepto block. De vez en cuando, puede que tenga que incluir una sentencia finally para manejar las nuevas medidas, en función de sus necesidades.

El concepto de codificación de las excepciones de Python generalmente se ve así:

 try:
"code to be executed"
except:
"error message"

Como se mencionó anteriormente, también puede usar finalmente en un bloque de excepción. Sin embargo, el código se escribe dentro de una cláusula finally es independiente y funciona si hay una excepción o no.

En esencia, es útil si tiene otro bloque de código que desea ejecutar de forma continua independientemente de lo que suceda dentro del intento … excepto el bloque.

He aquí un ejemplo:

 try:
print(9+6)
except:
print("error message")
finally:
print("please restart")
Output:
15
please restart

En el código anterior, reinicie la ejecución de forma continua, independientemente de si hay una excepción o no.

Una condición else también puede seguir a una declaración except :

 try:
C = 2 + B
except:
print("B needs to be defined")
else:
print(u"Added successfully! The result is %s"%(C))
Output: B needs to be defined

Ahora inténtelo de nuevo con "B" definido:

 try:
B = 5
C = 2 + B
except:
print("B needs to be defined")
else:
print(u"Added successfully! The result is %s"%(C))
Output: Added successfully! The result is 7

Los ejemplos anteriores son excepciones no estandarizadas. Pero puede tener una excepción más explícita cuando combina excepciones integradas (definidas) con excepciones no estandarizadas:

 try:
C = 2 + B
except NameError as err:
print(err, ":", "B needs to be defined, please")
else:
print(u"Added successfully! The result is %s"%(C))
Output: name 'B' is not defined : B needs to be defined, please

La excepción anterior primero verifica si hay un NameError en el bloque try . Luego imprime primero la excepción estándar NameError ("el nombre 'B' no está definido"). Y lo admite con su excepción escrita ("B debe definirse, por favor").

Relacionado: Principios básicos de programación que todo programador debe conocer

Y si desea manejar una cadena de excepciones, también puede acompañar un bloque try con muchas declaraciones except . Esto es bastante útil si su bloque de prueba tiene el potencial de tener muchas excepciones:

 try:
B = 5
C = 2 + B
D = float(6)
F = 7/0
except NameError as err:
print(err,":", "B needs to be defined, please")
except ValueError as val:
print(val,":", "You can't convert that data")
except ZeroDivisionError as zeroerr:
print(zeroerr,":", "You can't divide a number by zero")
else:
print(u"Operation successfull! The results are: %s, %s, and %s"%(C, D, F))
Output: division by zero : You can't divide a number by zero

¿Y si la división es válida? Por ejemplo, reemplazando F = 7/0 en el código anterior con F = 7/5 da:

 Output: Operation successfull! The results are: 7, 6.0, and 1.4

Excepciones definidas por el usuario en Python

También puede presentar su excepción y llamarlos más tarde en su programa. Esto le permite dar una descripción específica de su excepción y nombrarla como desee.

No obstante, cada excepción definida por el usuario (directa o indirectamente) todavía proviene de la clase Exception incorporada de Python.

El código de ejemplo a continuación hace referencia a la excepción base directamente llamando a RuntimeError desde ella:

 class connectionError(RuntimeError):
def __init__(self, value):
self.value = value
try:
raise connectionError("Bad hostname")
except connectionError as err:
print(err.value)
Output: Bad hostname

Tenga en cuenta que connectionError , en este caso, es una clase definida por el usuario, que puede generar en cualquier momento que lo necesite en su programa.

Relacionado: La guía para principiantes de expresiones regulares con Python

Puede realizar una excepción definida por el usuario derivándola directamente de la clase base Exception . Sin embargo, la siguiente excepción evita la resta de 5 de 6 y llama a la excepción de la clase base directamente:

 class errors(Exception):
pass
class sixFiveError(errors):
def __init__(self, value, message):
self.value = value
self.message = message
try:
raise sixFiveError(6-5,"This substraction is not allowed")
except sixFiveError as e:
print("There was an error:", e.message)
Output: There was an error: This substraction is not allowed

En la práctica, puede usar una excepción que definió anteriormente llamándola en otra función. Por ejemplo, puede crear un floatError que solo permite la adición de dos flotantes:

 # First call the base exception classes:
class errors(Exception):
pass
# Next, derive your own exception from the base class:
class FloatError(errors):
def __init__(self, value, message):
self.value = value
self.message = message
# Create a function to add two floats:
def addTwoFloat(a, b):
if (type(a) and type(b)) != float:
raise FloatError(a+b,"Numbers must be float to add")
else:
print(a + b)
addTwoFloat(4, 7)
Output: __main__.FloatError: (11, 'Numbers must be float to add')

Debido a que ahora ha definido una clase FloatError , Python la genera si intenta agregar dos literales no flotantes usando la función addtwoFloat .

Puede imprimir la clase FloatError en el mismo archivo de Python donde lo creó para ver qué sucede:

 print(FloatError)
Output: <class '__main__.FloatError'>

FloatError , sin embargo, no es una excepción incorporada de Python. Puede verificar esto llamando a FloatError en otro archivo Python nuevo donde no ha creado esta clase:

 print(FloatError)
Output: NameError: name 'FloatError' is not defined

Obtiene un NameError porque Python no lo reconoce como una excepción estándar.

También puede intentar autodefinir otras clases de error para ver cómo se desarrollan.

Haga que sus programas de Python sean más fáciles de usar con excepciones

Hay muchas excepciones estándar en Python. Pero también puedes definir el tuyo. No obstante, la facilidad de uso de su programa depende hasta cierto punto de cómo maneja varias excepciones (ya sean definidas por el usuario, no específicas o estándar).

Sin embargo, las excepciones le permiten dictar cómo debe funcionar su programa cuando los usuarios interactúan con ellos. Declarar de forma clara y concisa la causa de un error también les da a los usuarios un aviso sobre lo que están haciendo mal y, a veces, les indica la dirección correcta.