Manejo de excepciones de Python

    Este tutorial dar谩 una introducci贸n a qu茅 son las excepciones de Python, los tipos m谩s comunes de excepciones y c贸mo manejar las excepciones planteadas con el try y except cl谩usulas.

    驴Qu茅 es una excepci贸n de Python?

    Una excepci贸n de Python es una construcci贸n que se usa para se帽alar un evento importante, generalmente un error, que ocurre al ejecutar un programa. Una excepci贸n puede hacer que el programa se detenga si no se “detecta” correctamente (es decir, se maneja correctamente). Si cree que su programa puede generar una excepci贸n cuando se ejecuta, le resultar谩 煤til utilizar try/except para manejarlos, que veremos en la siguiente secci贸n.

    Manejo de excepciones

    En el siguiente ejemplo, le pedimos al usuario que ingrese un n煤mero y, despu茅s de la ejecuci贸n, el programa da el valor del n煤mero dado al cuadrado. El programa funcionar谩 siempre que ingrese un n煤mero como su entrada.

    while True:
        x = int(raw_input("Please enter a number: "))
        print("%s squared is %s" % (x, x**2))
    

    Cuando ingresa una cadena, o cualquier otro car谩cter que no sea un n煤mero, como “uno”, el programa generar谩 una excepci贸n de “Error de valor”, como se muestra a continuaci贸n:

    $ python squared.py 
    Please enter a number: 3
    3 squared is 9
    Please enter a number: 4
    4 squared is 16
    Please enter a number: five
    Traceback (most recent call last):
      File "squared.py", line 4, in <module>
        x = int(raw_input("Please enter a number: "))
    ValueError: invalid literal for int() with base 10: 'five'
    

    Aqu铆 es donde entra en juego el manejo de excepciones. Necesita saber c贸mo manejar correctamente las excepciones, especialmente en entornos de producci贸n, porque si no se manejan, su programa no sabr谩 qu茅 hacer y se bloquear谩.

    Veamos c贸mo podemos manejar el error anterior. Esto se hace rodeando el programa que cree que podr铆a generar una excepci贸n con un try palabra clave y emparejarla con un siguiente except palabra clave para ejecutar en caso de que se genere una excepci贸n.

    Reescribamos el mismo programa, y 鈥嬧媏sta vez ocup茅monos de las excepciones que puedan surgir.

    while True:
        try:
            x = int(raw_input("Please enter a number: "))
            print("%s squared is %s" % (x, x**2))
        except ValueError:
            print("Please enter a valid number!")
    

    Como puede ver en el programa anterior, el c贸digo dentro del try La sentencia se ejecuta primero. Si no ocurre ning煤n error, el resto del c贸digo se ejecuta y el except se omite la declaraci贸n.

    En el caso de que se genere una excepci贸n (como cuando se ingresa una cadena en lugar de un n煤mero), el programa ejecuta el except declaraci贸n que coincide con su try declaraci贸n, sigui贸 el resto del c贸digo fuera del try/except bloque, si lo hay.

    Vea lo que sucede cuando ejecutamos nuestro c贸digo con el try/except declaraciones:

    $ python safe_squared.py 
    Please enter a number: 3
    3 squared is 9
    Please enter a number: 4
    4 squared is 16
    Please enter a number: five
    Please enter a valid number!
    Please enter a number: 5
    5 squared is 25
    

    Nota: Tenga en cuenta que un except cl谩usula solo manejar谩 excepciones de su correspondiente try cl谩usula, incluso si hay m煤ltiples try/except manipuladores de cl谩usulas.

    Tipos de excepciones en Python

    Python tiene varias excepciones integradas. Echemos un vistazo a algunas de las excepciones m谩s comunes para que pueda obtener una perspectiva de qu茅 son y c贸mo usarlas.

    Excepci贸n de KeyError

    Este es un error que ocurre cuando se usa un diccionario y se intenta recuperar una clave que no est谩 presente en el diccionario.

    La siguiente es una vista de Django utilizada para autenticar usuarios y espera recibir un diccionario que contenga las claves “nombre de usuario” y “contrase帽a”. Si alguna de las claves no se pasa en los datos, el programa generar谩 una excepci贸n de Error de clave.

    def authenticate_user(request):
        try:
            email = request.data['username']
            password = request.data['password']
    
            user = authenticate(email=email, password=password)
    
            if user and user.is_active:
                return Response(user_details,status=HTTP_200_OK)
            else:
                res = {'error': 'can not authenticate with the given credentials'}
                return Response(res, status=status.HTTP_400_BAD_REQUEST)
        except KeyError:
            res = {'error': 'please provide a username and a password'}
    

    Mediante el uso try/except para detectar la excepci贸n, nuestro usuario ver谩 el error en lugar de bloquear nuestro servidor.

    Excepci贸n IndentationError

    Este tipo de excepci贸n se genera cuando su c贸digo no est谩 sangrado correctamente. En lugar de usar llaves para especificar el alcance, Python usa sangr铆a, por lo que es importante que la sangr铆a sea correcta, que es el prop贸sito de esta excepci贸n.

    Escribamos una funci贸n que verifique si un n煤mero es par:

    def is_even(number):
        if number % 2 == 0:
        print(" %s is an even number" % (number))
        else:
        print("%s is an odd number" % (number))
    
    print(is_even(1))
    print(is_even(2))
    

    La funci贸n dar谩 como resultado un error de sangr铆a en las l铆neas 2 y 4 porque espera que el c贸digo tenga 8 espacios, no 4.

    Si ejecuta el programa, dar谩 el siguiente resultado:

    $ python is_even.py 
      File "is_even.py", line 3
        print(" %s is an even number" % (number))
            ^
    IndentationError: expected an indented block
    

    Excepci贸n SyntaxError

    Este es uno de los tipos de excepciones m谩s comunes en Python. Ocurre cuando hay un error en la sintaxis de su c贸digo.

    Veamos el siguiente ejemplo:

    def is_odd(n):
        if n % 2 != 0:
            print(it's odd)
        else:
            print("not odd")
    
    print(is_odd(7))
    

    La salida de este c贸digo dar谩 como resultado una sintaxis no v谩lida en la l铆nea 3 porque la cadena “es impar” no est谩 entre comillas.

    $ python is_odd.py 
      File "is_odd.py", line 3
        print(it's odd)
                      ^
    SyntaxError: EOL while scanning string literal
    

    Tenga en cuenta que existen muchos tipos diferentes de errores de sintaxis, y este es solo un ejemplo.

    Excepci贸n TypeError

    Esta excepci贸n se genera cuando se intenta una operaci贸n o funci贸n que no es v谩lida para el tipo de datos especificado. En el siguiente ejemplo, la funci贸n sum_of_numbers toma 2 argumentos y los suma. Cuando intenta llamar a la funci贸n con 3 argumentos, genera una excepci贸n TypeError porque solo espera 2 argumentos.

    def sum_of_numbers(a, b):
        return a + b
    
    print(sum_of_numbers(1, 2, 7))
    

    La ejecuci贸n de este c贸digo produce el siguiente resultado:

    $ python sum_of_numbers.py 
    Traceback (most recent call last):
      File "sum_of_numbers.py", line 4, in <module>
        print(sum_of_numbers(1, 2, 7))
    TypeError: sum_of_numbers() takes exactly 2 arguments (3 given)
    

    Las cl谩usulas try / except, else y finalmente

    Hay varios otros componentes del manejo de excepciones y ese es el else y finally cl谩usulas.

    Ya hemos podido utilizar declaraciones try y catch, que se utilizan para detectar errores. Veamos ahora el else y finally declaraciones tambi茅n.

    La cl谩usula else

    La cl谩usula else se usa para ejecutar c贸digo cuando el programa no genera una excepci贸n. Tambi茅n es mejor usar la cl谩usula else que agregar c贸digo adicional al try cl谩usula. Esto se debe a que evita detectar involuntariamente una excepci贸n que no fue provocada por el c贸digo protegido por el try/except declaraciones.

    Considere el ejemplo que usamos al principio de este tutorial, pero en su lugar vamos a ejecutar el print declaraci贸n dentro del else declaraci贸n.

    while True:
        try:
            x = int(raw_input("Please enter a number: "))
        except ValueError:
            print("Please enter a valid number!")
        else:
            print("%s squared is %s" % (x, x**2))
    

    La ejecuci贸n de este c贸digo proporciona la misma funcionalidad que antes, excepto que a铆sla las personas propensas a errores. int(raw_input(...)) c贸digo en el try declaraci贸n y el c贸digo “seguro” en el else declaraci贸n.

    $ python else_squared.py 
    Please enter a number: 3
    3 squared is 9
    Please enter a number: 4
    4 squared is 16
    Please enter a number: five
    Please enter a valid number!
    Please enter a number: 5
    5 squared is 25
    

    La cl谩usula finalmente

    Esta cl谩usula est谩 destinada a definir acciones de limpieza que deben realizarse independientemente de si se gener贸 una excepci贸n o no.

    UN finally La cl谩usula siempre debe ejecutarse antes de salir del try/except declaraci贸n, si se ha producido una excepci贸n o no. Esto se usa generalmente para limpiar, como cerrar un archivo abierto.

    Incluyamos el finally cl谩usula en nuestro ejemplo:

    count = 0
    
    while True:
        try:
            x = int(raw_input("Please enter a number: "))
        except ValueError:
            print("Please enter a valid number!")
        else:
            print("%s squared is %s" % (x, x**2))
        finally:
            print("Ran %s time(s)" % count)
    

    Ejecutar este c贸digo es similar a antes, excepto que ahora podemos ver cu谩ntas veces se ha ejecutado nuestro bucle, independientemente de si se gener贸 una excepci贸n o no:

    $ python finally_squared.py 
    Please enter a number: 3
    3 squared is 9
    Ran 1 time(s)
    Please enter a number: 4
    4 squared is 16
    Ran 2 time(s)
    Please enter a number: five
    Please enter a valid number!
    Ran 3 time(s)
    Please enter a number: 5
    5 squared is 25
    Ran 4 time(s)
    

    Conclusi贸n

    En este tutorial explicamos brevemente c贸mo manejar excepciones en Python usando el try/except declaraciones, incluidos algunos de los componentes opcionales, else y finally. Espero que este tutorial haya aclarado cualquier confusi贸n que tuviera sobre las excepciones de Python.

    Si desea obtener m谩s informaci贸n, puede encontrar m谩s informaci贸n en el Errores y excepciones secci贸n de la documentaci贸n de Python.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *