Como programador, seguro que se encuentra con errores mientras desarrolla software. Esto puede ir desde errores en su lógica que conducen a resultados inesperados, errores derivados de la violación de las reglas de un lenguaje de programación, hasta incluso errores que surgen mientras ejecuta su programa, entre muchos otros. Estos errores se conocen comúnmente como bugs.

Los bugs son omnipresentes en todos los lenguajes de programación, independientemente de lo fácil que sea aprender o utilizar el lenguaje.

En Python, por ejemplo, aunque el lenguaje hace hincapié en la legibilidad, sigue una sintaxis expresiva y se considera relativamente fácil de aprender y utilizar en comparación con otros lenguajes de programación, aún así no es inmune a los errores de programación cuando utiliza Python.

Dado que es inevitable que se produzcan errores, una buena forma de afrontarlos es conocer los distintos tipos de errores que pueden producirse y cómo se producen. Esto le permitirá evitar o minimizar estos errores mientras programa y también saber cómo manejarlos cuando surjan.

Estos son algunos de los errores comunes de Python que puede encontrar mientras programa utilizando el lenguaje:

SyntaxErrors

Un error de sintaxis es un error que surge cuando escribe código que viola las reglas del lenguaje de programación que está utilizando. El resultado es una línea de código no válida.

En Python, por ejemplo, cuando se imprime una cadena, es necesario ponerla entre comillas. Si no lo hace, se produce un error de sintaxis.

Un error de sintaxis también puede surgir cuando se omiten los paréntesis de apertura o cierre, los corchetes o las llaves, cuando se escriben mal las palabras clave o los nombres de las funciones, cuando se omiten los dos puntos al final de las sentencias de control de flujo o cuando se omiten los operadores requeridos en las expresiones.

Generalmente, los errores de sintaxis surgirán si viola una regla sobre cómo debe escribirse el código Python.

## error de sintaxis por falta de comillas
## alrededor de la cadena que se imprime
print("Hola Mundo)

edad = 20
## Error sintáctico por falta de dos puntos en una sentencia if
if edad > 18
    print("La edad es superior a 18")

## Error sintáctico debido a que '(' nunca se cerró
def cuadrado(x:
    return x * x
print(cuadrado(4))

Al ejecutar el código anterior, se encontrará con un mensaje de error como el que se muestra a continuación:

Screenshot-from-2023-06-01-19-45-08

El mensaje de error al ejecutar el código es el siguiente:

 Archivo "/home/madici/Desktop/helloworld.py", línea 1
    print("Hola Mundo)
          ^
SyntaxError: unterminated string literal (detectado en la línea 1)

Para solucionar estos errores, utilice la sintaxis correcta de Python como se muestra a continuación:

print("Hola Mundo")

edad = 20
si edad > 18
    print("La edad es superior a 18")

def cuadrado(x):
    return x * x
print(cuadrado(4))

IndentationError

A diferencia de otros lenguajes como Java, C o C , que utilizan llaves para separar bloques de código, Python utiliza la sangría para definir la jerarquía y la estructura de los bloques de código. Por ejemplo, al escribir sentencias de control en Java, todo el código a ejecutar una vez evaluada la condición está contenido dentro de llaves.

En Python, sin embargo, el bloque de código estará sangrado. Una sangría típica en Python consiste en cuatro espacios o una tabulación. Sin embargo, el número de espacios no importa mientras se mantenga consistente a lo largo de todo el código que se escribe.

Como programador de Python, es probable que se encuentre con errores de indentación cuando no añada la indentación requerida, como al escribir sentencias de control o funciones, cuando utilice tanto tabuladores como espacios para crear indentaciones ya que confunde al intérprete, cuando coloque las indentaciones en el lugar equivocado o cuando sus indentaciones no sean consistentes a lo largo de su código base.

A continuación se muestra un ejemplo de código que da lugar a un error de sangría:

edad = 20
if edad > 18:
print("La edad es superior a 18")
   print("Puede conducir")
si no
    print("La edad es inferior a 18")

A continuación se muestran los mensajes de error resultantes del código anterior:

Screenshot-from-2023-06-04-11-21-59

El mensaje de error resultante de ejecutar el código es el siguiente:

 Archivo "/home/madici/Desktop/helloworld.py", línea 3
    print("La edad es superior a 18")
    ^
IndentationError: expected an indented block after 'if' statement on line 2

Para corregir los errores indente la línea después de la sentencia if ya que se requiere una indentación y asegúrese de que coincide con la indentación en el resto del código como se muestra a continuación:

edad = 20
if edad > 18:
   print("La edad es superior a 18")
   print("Tiene permiso para conducir")
si no
   print("La edad es inferior a 18")

TypeError

En Python, un TypeError es una excepción que surge cuando intenta realizar una operación utilizando un tipo de datos incompatible. Por ejemplo, si intenta sumar una cadena y un entero o concatenar un tipo de datos cadena con un entero, se encontrará con un TypeError.

También puede encontrarse con TypeErrors cuando utilice funciones o métodos con tipos de datos incorrectos, cuando intente utilizar un índice no entero para acceder a elementos de un iterable como una lista, o cuando intente iterar a través de un objeto que no puede ser iterable.

En general, cualquier operación que utilice un tipo de datos incorrecto provocará un TypeError.

A continuación se muestran ejemplos de operaciones que pueden dar lugar a TypeErrors:

# Error de tipo resultante de concatenar una cadena un entero
edad = 25
mensaje = "Tengo " edad " años"


list1 = [1, "hola", 5, "mundo", 18, 2021]
#Errores tipográficos resultantes de un uso incorrecto de los métodos incorporados
print(suma(lista1))

#Error de tipo resultante de sumar una cadena y un entero
num1 = 10
num2 = "16"
print(num1 num2)

#ErrorTipo resultante de utilizar un índice no entero
list2 = ["hola", "de", "el", "otro", "lado"]
print(list2["1"])

A continuación se muestran los mensajes de error resultantes del código anterior:

Screenshot-from-2023-06-04-11-57-37

A continuación se muestra un ejemplo de mensaje TypeError del código:

 File "/home/madici/Desktop/helloworld.py", line 3, in <module&gt
    message = "Tengo " edad " años"
              ~~~~~~~~^~~~~
TypeError: sólo se puede concatenar str (no "int") con str

Para eliminar los errores, utilice los tipos de datos correctos o conversiones de tipo como se muestra a continuación:

edad = 25
mensaje = "Tengo " str(edad) " años"

list1 = [1, 5, 18, 2021]
print(suma(lista1))

num1 = 10
num2 = "16"
print(num1 int(num2))

list2 = ["hola", "de", "el", "otro", "lado"]
print(list2[1])

AttributeError

En Python, se produce un AttributeError cuando se intenta utilizar un atributo que no existe en el objeto o llamar a un método que no existe en el objeto sobre el que se llama. Un AttributeError muestra que un objeto no tiene un atributo o método al que se está llamando en él.

Por ejemplo, si llama a un método de cadena sobre un número entero, se encontrará con un AttributeError porque el método no existe en el tipo de objeto sobre el que se está llamando.

En el ejemplo que se muestra a continuación, el método capitalize(), que se utiliza para convertir la primera letra de una cadena a mayúsculas, está siendo llamado sobre un entero. El resultado es un error de atributo porque int no tiene el método capitalize().

# AttributeError derivado de llamar a capitalize() sobre un valor int
num = 1445
cap = num.capitalize()
print(cap)

La ejecución de este código da como resultado el mensaje de error que se muestra a continuación:

Screenshot-from-2023-06-08-10-04-12

El mensaje AttributeError del código es el siguiente:

 File "/home/madici/Desktop/helloworld.py", line 3, in <module&gt
    cap = num.capitalize()
          ^^^^^^^^^^^^^^
AttributeError: El objeto 'int' no tiene el atributo 'capitalize'

Para resolver un AttributeError, asegúrese de que el método o atributo al que llama existe en el tipo de objeto sobre el que lo llama. En este caso, llamar a capitalize() en un tipo de datos string resuelve este error como se muestra a continuación:

Screenshot-from-2023-06-08-10-07-36

ImportError

El ImportError en Python se produce cuando intenta importar un módulo que no se puede encontrar o no es accesible en su entorno actual. Puede ser que aún no esté instalado, que no haya configurado correctamente su ruta o que haya escrito mal el módulo que intenta instalar.

Un ImportError tiene una única subclase hija llamada ModuleNotFoundError que es el error que se lanza cuando se intenta importar un módulo que no se puede encontrar.

Por ejemplo, el código de abajo con intenta importar la biblioteca de análisis de datos pandas arroja un error de este tipo porque el módulo aún no está instalado.

Screenshot-from-2023-06-09-10-46-17

El mensaje ImportError generado se muestra a continuación:

 Archivo "/home/madici/Desktop/helloworld.py", línea 1, en <module&gt
    importar pandas
ModuleNotFoundError: No module named 'pandas'

Para solucionar un error de este tipo, asegúrese de que los módulos que intenta importar están instalados. En caso de que eso no resuelva el error, compruebe si está utilizando la grafía correcta para el módulo y la ruta de archivo correcta para acceder al módulo.

ValueError

Se trata de una excepción que se produce cuando una función en Python recibe un valor del tipo de datos correcto pero el valor es un valor inapropiado. Por ejemplo, la función Math.sqrt() utilizada para hallar la raíz cuadrada de valores numéricos devolverá un ValueError si se le pasa un número negativo.

Por mucho que el valor sea del tipo correcto, es decir, un valor numérico, el hecho de ser negativo lo convierte en un valor inapropiado para la función

La función int() que convierte un número o una cadena devolverá un ValueError si pasa una cadena que no es un valor numérico de cadena. Pasar «123», o «45» a la función no devuelve ningún error ya que las cadenas pueden convertirse al valor entero apropiado.

Sin embargo, si pasa una cadena que no es un valor de cadena numérico como «Hola» devuelve un ValueError. Esto se debe a que «Hola», aunque es una cadena, es inapropiada ya que no tiene un equivalente entero.

A continuación se muestra un ejemplo de código que genera un ValueError:

# Error de valor resultante de un valor int inapropiado en sqrt()
importar math
num = -64
raíz = math.sqrt(num)
print(raíz)

# Error de valor resultante de pasar una cadena sin número entero
# equivalente en la función int()
numCadena = "Hola"
num = int(numCadena)
print(num)

A continuación se muestran los errores del código anterior:

Screenshot-from-2023-06-08-11-21-53

El mensaje de error generado es el siguiente

 File "/home/madici/Desktop/helloworld.py", line 4, in <module&gt
    raíz = math.sqrt(num)
           ^^^^^^^^^^^^^^
ValueError: error de dominio matemático

Para corregir el error, utilice valores apropiados en las funciones como se muestra a continuación:

import math
num = 64
raíz = math.sqrt(num)
print(raíz)

numCadena = "5231"
num = int(numCadena)
print(num)

IOError

El IOError(Error de entrada/salida) es una excepción que se produce cuando falla una operación de entrada o salida. Esto puede ser causado por intentar acceder a un archivo que no existe, por insuficiente almacenamiento en disco en su dispositivo, por intentar acceder a un archivo para el que no tiene permisos suficientes o cuando intenta acceder a un archivo que está siendo utilizado actualmente por otras operaciones.

Métodos como open(), read(), write() y close() que se utilizan normalmente cuando se trabaja con archivos son los que probablemente causen un error de este tipo.

Considere el código siguiente que intenta abrir un archivo llamado «notas.txt» que no existe. El código produce un IOError que eleva el FileNotFoundError:

Screenshot-from-2023-06-09-10-19-58

Con el siguiente mensaje de error:

 File "/home/madici/Desktop/helloworld.py", line 2, in <module&gt
    archivo1 = open("notas.txt", "r")
            ^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No existe tal archivo o directorio: 'notas.txt'

Para evitar el error anterior, todo lo que tiene que hacer es asegurarse de que el archivo «notas.txt» existe en el directorio en el que está ejecutando el terminal. Otra forma de manejar los IOErrors es utilizando el bloque try except , como se muestra a continuación:

Screenshot-from-2023-06-09-10-32-52

NameError

El NameError es una excepción que encontrará cuando intente utilizar una variable, función o módulo que no existe, no está definida en el ámbito actual o no se le ha asignado un valor.

Un error de este tipo suele producirse cuando escribe mal los nombres de las variables o funciones o las utiliza antes de que estén definidas. Utilizar un módulo sin importarlo también dará lugar a un NameError.

El siguiente código dará lugar a una excepción NameError:

# el error de nombre se produce porque no se ha importado el módulo math
num = 64
raíz = math.sqrt(64)
print(raíz)

# El error de nombre surge porque x se utiliza antes de estar definido
y = 23
print(x)

#NameError porque el nombre de la función no está definido
def saludar():
    print("Buenos días")
great() #ameError: el nombre 'great' no está definido

Los siguientes mensajes de error son el resultado del código anterior:

Screenshot-from-2023-06-08-11-56-02

A continuación se muestra un ejemplo de mensaje NameError:

 File "/home/madici/Desktop/helloworld.py", line 3, in <module&gt
    raíz = math.sqrt(64)
           ^^^^
NameError: el nombre 'math' no está definido

Para resolver un NameError de este tipo, asegúrese de que no está utilizando módulos antes de importarlos, de que no está utilizando variables o funciones antes de definirlas y de que no está escribiendo mal los nombres de las funciones o variables:

import math
num = 64
raíz = math.sqrt(64)
print(raíz)

y = 23
print(y)

def saludar():
    print("Buenos días")
saludar()

IndexError

Un IndexError es una excepción que se produce cuando se intenta acceder a un índice de una lista o tupla que está fuera de rango. Considere la siguiente lista:

lista1 = [1, 2, 3, 4, 5]

La lista tiene cinco elementos. Python cuenta los índices a partir de 0(cero). Por lo tanto, la lista anterior tiene índices que van de 0 a n-1, siendo n el número o elementos de la lista. En este caso, el índice o la lista irán de 0 a 4.

Si intenta acceder a un elemento en un índice superior a 4, se encontrará con un IndexError porque el índice está fuera de rango en la lista desde la que intenta acceder a un elemento. El código siguiente genera un IndexError:

lista1 = [1, 2, 3, 4, 5]
item = list1<x>[</x> 6] #IndexError porque el índice de la lista está fuera de rango
print(item)

El error del código se muestra a continuación:

Screenshot-from-2023-06-09-09-02-43

El mensaje IndexError generado es el siguiente:

 File "/home/madici/Desktop/helloworld.py", line 2, in <module&gt
    item = list1<x>[6]</x> #IndexError porque el índice de la lista está fuera de rango
           ~~~~~^^^
IndexError: índice de lista fuera de rango

La mejor forma de evitar un IndexError es utilizar las funciones range() y len() para asegurarse de que sólo accede a los elementos que están dentro del rango, de esta forma

lista1 = [1, 2, 3, 4, 5]

for i in range(len(list1)):
    print(list1[i])

KeyError

Un KeyError es una excepción que se produce cuando se intenta acceder a un elemento de un diccionario utilizando una clave, y la clave no se encuentra en el diccionario. Considere el diccionario siguiente

ciudades = {"Canadá": "Ottawa", "EE.UU.": "Washington", "Italia": "Roma"}

Las claves del diccionario son «Canadá», «EE.UU.», «Italia». Puede acceder a los elementos del diccionario de ciudades utilizando las tres claves. Sin embargo, si intenta acceder a un elemento utilizando una clave que no existe, como «Brasil», se encontrará con un KeyError, como se muestra a continuación:

Screenshot-from-2023-06-09-09-38-06

El mensaje KeyError generado se muestra a continuación:

 Archivo "/home/madici/Desktop/helloworld.py", línea 6, en <module&gt
    print(ciudades["Brasil"])
          ~~~~~~^^^^^^^^^^
KeyError: 'Brasil'

Para resolver un KeyError, asegúrese de que las claves que está utilizando para acceder a los elementos de un diccionario están realmente presentes en el diccionario. Para ello, puede utilizar una sentencia if…else como la siguiente

ciudades = {"Canadá": "Ottawa", "EE.UU.": "Washington", "Italia": "Roma"}

país = "Canadá"

if país in ciudades:
    print("La capital de " país " es " ciudades[país])
si no
	print("La clave " país " no está presente en el diccionario ciudades")

De esta forma, evitará encontrarse con KeyErrors al acceder a elementos de un diccionario

Conclusión

Cuando codifique en Python, independientemente de su nivel de experiencia, es muy probable que se encuentre con errores. Por lo tanto, asegúrese de familiarizarse con los diferentes tipos de errores destacados en el artículo para asegurarse de que es capaz de manejarlos cuando surjan.

También puede explorar algunas útiles reglas de Python de una sola línea para simplificar tareas comunes.