Erros/exceções em Python#

O que você saberá se você ler todo este capítulo?#

A ideia não é ler todo ele, mas que possa servir como uma consulta. Assim, a ideia é você encontrar o erro que está tendo, entender o motivo dele aparecer e como resolver.

Grupos de exceções mais comuns#

Os tipos de exceções mais comuns em Python incluem:

  • IndexError: quando se tenta acessar um índice inexistente em uma lista ou tupla.

  • IOError: quando ocorre um erro durante a leitura ou gravação de um arquivo.

  • KeyError: quando se tenta acessar uma chave inexistente em um dicionário.

  • NameError: quando uma variável é usada antes de ser definida.

  • TypeError: quando ocorre uma operação incompatível com um tipo de dado específico.

  • ValueError: quando uma função recebe um argumento do tipo correto, mas com um valor inesperado.

  • ZeroDivisionError: quando se tenta dividir um número por zero.

IndexError#

Analogia: uma receita de bolo como uma lista de instruções a serem seguidas. Se tentarmos acessar uma instrução que não existe na lista, teremos um erro semelhante. Por exemplo, se a receita tem apenas 10 etapas numeradas de 1 a 10, e tentarmos seguir a instrução 11, teremos um erro.

Para evitar esses erros, verifique se o índice está dentro do intervalo permitido antes de tentar acessar o elemento correspondente. É possível usar a função len() para obter o tamanho da lista ou sequência e a declaração if para verificar se o índice está dentro dos limites.

IOError#

  • FileNotFoundError

Analogia com uma receita de bolo: a receita pede ovos. Você abre a geladeira e descobre que o ovo acabou.

Ocorre quando o Python tenta acessar um arquivo que não existe no sistema. Veja se o arquivo que você está tentando abrir existe e se você está tentando abrir no lugar correto.

KeyError#

Uma analogia com receita de bolo para o erro “KeyError” seria tentar encontrar uma receita em um livro de culinária usando uma página inexistente como referência. Por exemplo, imagine que um livro de culinária tenha receitas em suas páginas de 1 a 50, mas você tenta encontrar uma receita na página 60. Como essa página não existe, o livro não será capaz de encontrar a receita que você está procurando. Aqui é a mesma coisa.

Acontece quando você tenta acessar uma chave que não existe em um dicionário. Um exemplo de erro do tipo KeyError em Python é quando tentamos acessar uma chave que não existe em um dicionário. Por exemplo, se tivermos um dicionário com as chaves “nome”, “idade” e “sexo”, e tentarmos acessar a chave “endereço”, teremos um erro do tipo KeyError.

pessoa = {"nome": "João", "idade": 25, "sexo": "masculino"}
endereco = pessoa["endereco"]

Aqui, apareceria uma mensagem de erro com o conteúdo KeyError: 'endereco'. Da mesma forma que o endereco não existe naquele dicionário chamado pessoa, veja se o que você está tentando acessar realmente existe no dicionário antes de prosseguir.

NameError#

Acontece quando o Python não encontrou a definição/onde está aquela variável ou função que você deseja usar.

  • NameError: name 'nome_da_variavel' is not defined

  • NameError: name 'nome_da_funcao' is not defined

Analogamente, podemos pensar em uma receita de bolo onde o cozinheiro precisa utilizar um ingrediente que não foi listado na receita. Nesse caso, ele precisaria verificar se está utilizando todos os ingredientes necessários, se leu direito a receita, e adicionar o ingrediente que está faltando antes de prosseguir com a mesma.

Veja se você não digitou incorretamente o nome de uma variável ou função, ou se não está as usando no momento/local correto do código.

TypeError#

O tipo TypeError ocorre quando uma operação ou função é aplicada a um tipo de objeto incorreto.

  • TypeError: unsupported operand type(s) for +: 'int' and 'str'

Usando uma analogia com uma receita de bolo, imagine que você está seguindo uma receita de bolo e, em determinado momento, a receita pede para que você misture 2 colheres de açúcar com 1 colher de farinha de trigo. Você sabe que açúcar e farinha de trigo são ingredientes diferentes e que não podem ser misturados diretamente, assim como inteiros e strings em Python não podem ser concatenados diretamente usando o operador “+”.

Ocorre quando você tenta somar um número a uma string (texto). Para resolver esse erro, é necessário converter o número inteiro em uma string antes de somá-lo à outra string. Isso pode ser feito usando a função “str()”, que converte um objeto em sua representação em string.

Por exemplo, se você quiser somar um número inteiro “x” à string “olá”, você deve fazer:

x = 42
s = "olá"
result = s + str(x)
print(result)

Isso irá converter o número inteiro em uma string e concatená-lo à string olá, produzindo a saída olá42.

Um erro assim também pode ocorrer ao tentar somar uma string a uma lista, por exemplo. Nesse caso, a solução é converter a string em uma lista antes de tentar somá-la à outra lista.

  • TypeError: 'NoneType' object is not iterable

Usando uma analogia: imagine que estamos seguindo uma receita para fazer um bolo e uma das etapas é misturar os ingredientes secos em uma tigela. Porém, se não tivermos esses ingredientes disponíveis ou se misturarmos outros ingredientes que não sejam os corretos, não poderemos realizar essa etapa. Em outras palavras, a tigela estará vazia ou com ingredientes incompatíveis e, portanto, não será possível misturá-los para obter a massa do bolo.

Ocorre quando tentamos iterar (percorrer/fazer um loop/usar um for ou um while) sobre uma variável que não tem nada dentro dela. Para resolver esse erro, é preciso verificar se o objeto em questão não é None (vazio) antes de tentar iterar sobre ele.

Uma das formas de fazer isso é utilizando uma estrutura de condição (if) para ver se o objeto é diferente de None antes de iterar sobre ele. Por exemplo:

lista = None

if lista is not None:
    for item in lista:
        print(item)
else:
    print("A lista está vazia")

Nesse exemplo, antes de tentar iterar sobre a lista, verificamos se ela é diferente de None. Se for diferente, podemos iterar normalmente. Caso contrário, exibimos uma mensagem indicando que a lista é vazia.

  • TypeError: 'int' object is not callable

Usando uma analogia com uma receita de bolo, é como se você estivesse seguindo uma receita que pede para misturar os ingredientes secos em uma tigela e depois adicionar o leite e o óleo vegetal, misturando tudo até formar uma massa homogênea. Porém, ao invés de colocar o leite, você acidentalmente adiciona um copo de água, resultando em uma massa muito líquida e difícil de trabalhar. Nesse exemplo, o leite seria o objeto correto que você deveria ter adicionado, enquanto a água seria o objeto int que não é callable, ou seja, não pode ser chamado para executar uma ação naquele contexto específico. Assim como a receita de bolo não funciona corretamente com a adição de um ingrediente errado, o código em Python também pode gerar erros quando o tipo de objeto utilizado não é compatível com a operação que está sendo realizada.

Este erro acontece quando você tenta usar uma variável como sendo uma função. Para corrigir esse erro, basta verificar se a sua variável é realmente uma função antes de tentar chamá-la.

  • TypeError: 'str' object does not support item assignment

Usando uma analogia com uma receita de bolo, seria como tentar substituir um ingrediente específico por outro em uma receita que já foi preparada e misturada. Uma solução seria criar uma nova receita com o ingrediente correto desde o início ou remover o ingrediente errado e acrescentar o ingrediente correto separadamente.

Este erro acontece quando você tenta mudar o valor de um caractere específico de uma string em Python, o que não é permitido porque as strings são objetos imutáveis (ou seja: você não pode modificar ela depois que ela é criada).

  • TypeError: 'tuple' object does not support item assignment

Podemos pensar na tupla como uma receita de bolo em que os ingredientes são listados na ordem correta e não podem ser modificados. Se quisermos adicionar um ingrediente ou alterar a quantidade de um ingrediente, não podemos simplesmente alterar a receita original. Precisamos criar uma nova receita ou escrever as mudanças em uma cópia da receita original.

Ocorre quando tentamos atribuir um valor a um item específico de uma tupla, o que não é possível porque as tuplas são imutáveis em Python. Para resolver esse erro, podemos criar uma nova tupla com os valores atualizados ou converter a tupla em uma lista, modificar o valor desejado e, em seguida, converter a lista novamente em uma tupla.

ValueError#

Ocorrem quando o tipo de dado é correto, mas o valor é inválido para a operação que está sendo realizada.

  • ValueError: invalid literal for int() with base 10

Uma analogia com uma receita de bolo para esse erro seria tentar usar uma xícara de farinha de trigo para medir uma xícara de açúcar. Ambos são ingredientes em pó, mas são diferentes em suas características e funções na receita. Da mesma forma, a função int() espera receber uma string que represente um número inteiro, mas se você passar uma string que não possa ser convertida em um número, como “cinco”, o erro ValueError será gerado.

Ocorre quando você está tentando converter uma string que não é um número para um número. É como se você estivesse tentando converter o texto banana para número, mas banana possui letras, e não dígitos. Não é como se você estivesse convertendo um texto 15 para número, que aí sim possuiria somente dígitos.

  • ValueError: math domain error

Analogia com receita de bolo: tentar assar o liquidificador. Você teria que assar a massa do bolo que você preparou, e não este eletrodoméstico.

Acontece quando você tenta fazer uma operação que não faz sentido para aquele número. Um exemplo seria calcular a raiz quadrada de um número negativo.

  • ValueError: could not convert string to float

Analogia com receita de bolo: a receita pede para você medir 1/2 xícara de açúcar, mas você acidentalmente coloca farinha na xícara em vez de açúcar. Quando você tenta adicionar a farinha à mistura, ela não funciona da mesma forma que o açúcar e pode estragar todo o bolo.

Acontece quando você tenta converter uma string que não é um número para um número, ou quando você tenta converter um número que possui vírgulas no lugar de pontos. É como se você estivesse tentando converter o texto banana para número, mas banana possui letras, e não dígitos. Não é como se você estivesse convertendo um texto 15.5 para número, que aí sim possuiria somente dígitos e o ponto que divide separa o valor inteiro das casas decimais. Outro exemplo é quando você tentaria converter 15,5. Em Python, precisamos usar pontos ao invés de vírgulas para dividir o valor inteiro do valor decimal.

  • ValueError: not enough values to unpack (expected x, got y)

Em uma analogia com uma receita de bolo, podemos imaginar que estamos seguindo uma receita que pede para misturar dois ingredientes, mas acabamos adicionando três. Por exemplo, a receita pede para misturar açúcar e manteiga, mas adicionamos também a água. Quando chegamos na etapa de misturar, a receita pede para misturar os dois itens com cuidado para não estragar: só que agora é tarde demais.

Ocorre quando tentamos extrair/trabalhar com mais valores do que uma função retorna. Por exemplo, se temos a sequência (1, 2) e tentamos atribuir os valores a três variáveis, teremos um erro desse tipo. Verifique quantos itens realmente existem naquele momento do código.

ZeroDivisionError#

O tipo TypeError aparece quando se tenta dividir um número por zero em Python. Este erro pode ocorrer em diferentes situações, como em expressões matemáticas que envolvem divisão, ou quando se tenta calcular a média de uma lista vazia, por exemplo.

Verifique se o denominador da sua divisão não é zero.

Referências bibliográficas#