Tutorial 14, Tratamiendo de las Excepciones.

Hola a tod@s de nuevo, hoy voy a tratar un tema que normalmente a la gente no le gusta pero que es muy interesante, las excepciones.

Cuando el intérprete de python detecta un error en nuestro programa, ya sea de sintaxis o de cualquier otra índole, nos da unos errores llamados excepciones, por ejemplo si hacemos:

print 5/0



Nos tirará una excepción ya que no se puede dividir entre cero, o si escribimos:

         print "hola"
print "hola2"

Nos dará una excepción por que el primer print esta tabulado pero no esta dentro de ningún bucle, condicional....

Pero....¿Cómo podemos tratar estos errores que nos da python?, con un par de palabras clave llamadas "try" y "except", (significan "intentar" y "excepción" en inglés).

Ponemos el bloque de código que puede contener errores o que puede fallar dentro del "try", y dentro del "except" el código a ejecutar en caso de que falle:

Ejemplo 1:

def div(a, b):
        try:
               return a/b
         except:
               return "no se puede dividir entre cero"

print div(8, 2)
#imprimiría 4

print div(8, 0)
#imprimiría "no se pude dividir entre cero"

Como véis tan sólo ponemos el código tabulado dentro del try y el except y ya esta, en caso de que de cualquier error en vez de tirarnos la excepción correspondiente, imprimirá "no se puede dividir entre cero".

Además la construcción try-except puede también contener una cláusula else y una cláusula finally, else se ejecutará en caso de que no haya ocurrido ningún error y finally se ejecutará siempre, ocurra o no un error:

Ejemplo 2:

def div(a, b):
        try:
               return a/b
         except:
               return "no se puede dividir entre cero"
         else:
               print "no ha habido ningún error en la división"
         finally:
               print "este código se ejecutará siempre"

print div(5, 2)
print div(5, 0)

Cabe destacar que después del except podemos indicar el tipo de error específico como "NameError" o "ValueError":

Ejemplo 3:
try:
      print a
except NameError:
      print "la variable a no existe"
except ValueError:
      print "esto no se ejecuta por que no hay ningún error correspondiente al valor de alguna variable"

Ejemplo 4:
try:
     int("hola")

except NameError:
      print "esto no se ejecuta por que no hay ningún error correspondiente a el nombre de alguna variable"
except ValueError:
      print "error, no se puede transformar una cadena de texto en un valor entero"

Pd: Recordamos que la función int() sirve para transformar un número guardado como cadena "5" en un valor entero 5.

Como véis la principal finalidad de esta construcción es crear errores propios pos así decirlo, que en vez de tirarnos el error del intérprete, de un error escrito por nosotr@s, pero tiene otras muchas aplicaciones muy interesantes, por ejemplo hace un tiempo, hice un pequeño y simple escaner de puertos en python, tan sólo decía los puertos que estaban abiertos y cuales cerrados, y lo hacía probando una conexión a través de un puerto con sockets (ya llegaremos a eso) y si no daba níngun error es que estaba abierto, si no, es que estaba cerrado.

Bueno, espero que os haya gustado el tutorial de hoy, a lo mejor ahora no le véis mucha utilidad, pero ya veréis cuando lleguemos a los sockets y explique mejor lo del escaner de puertos jeje, bueno, un abrazo a tod@s y hasta el siguiente tutorial.


2 comentarios:

Tuus dijo...

Muy interesante, gracias!

Francisco Dominguez Lerma dijo...

De nada Tuus :)