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 ​​esta 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 *