Tratando exceções

Teoria Completa

Reconhecendo exceções

Cara, nem sempre a gente pode garantir que um código que a gente escreveu vai funcionar sempre. Imagina esse programa como exemplo, meramente ilustrativo:

Nosso programa de exemplo perguntar ao usuário um número e calcula quanto é 30 dividido por esse número. Depois, esse resultado é exibido pro usuário. Beleza! Mas, cara, se o usuário digitar 0 vai dar treta nisso aí! Apesar disso, nosso código não necessariamente tá errado, entende?! Acontece que existem casos onde o código falha. Existem exceções, e essa é a palavra do dia.

Sabendo reconhecer que nosso código pode ter exceções no seu funcionamento, a gente pode tratar essas exceções a nossa maneira!

Tratando exceções

Primeiramente, deixa eu te falar o que significa tratar exceções. Tá ligado que quando algum erro acontece, aparece aquelas letrinhas vermelhas com o erro?! Então... Tratar exceções significa que a gente quer tratar manualmente esses erros. Em vez das letrinhas vermelhas, o código vai executar.

Pra isso, vamos aprender três novas palavras-chave: try, except e finally. O código abaixo ilustra o esqueleto das estruturas de tratamento de exceções, mas ainda vou detalhar os usos das palavras-chave.

Palavra-chave try

A palavra try (“tentar”, em inglês) é usada pra criar um bloco de código que talvez dê errado. Essa palavra chave é a alma do tratamento de exceções. Só da pra gente tratar exceções que estão dentro do bloco try.

Palavra-chave except

A gente usa a palavra-chave except (“exceção”, em inglês) pra definir o que deve acontecer caso dê erro! Isso significa que o código dentro desse bloco não vai ser executado caso tudo dê certo. Repara que no código de exemplo, a gente usou um print() dizendo que não foi possível calcular o resultado e definimos a variável “resultado” pra zero. Esse código só é executado quando o código no bloco try der treta e não funcionar.

Se a gente colocar o except, igual na imagem acima, QUALQUER erro que der no código do try vai simplesmente chamar o bloco except. No entanto, a gente também consegue especificar o erro que a gente quer tratar!

Nesse código, a gente tá especificando que só quer tratar o erro da divisão por zero. Então, qualquer outro erro seria tratado normalmente pelo Python (malditas letrinhas vermelhas)..

Mas repara que pra especificar o erro que você quer tratar, é preciso especificar o nome do erro! E aí você me pergunta: “cara, como diabos eu vou saber o nome do erro?”.

Bom, o macete é você não decorar, mas provocar o erro de propósito pra copiar seu nome! Olha, vou colocar na primeira linha do meu código uma conta que com certeza vai dar o erro de divisão por zero.

Quando tentei executar...

Olha ele aí... Conseguimos descobrir o nome do erro provocando o erro propositalmente! Malandramente! Hahaha

Obs: eu tô usando o erro de divisão por zero como um exemplo. Na verdade, essa estrutura funciona pra qualquer tipo de erro. Vou usar um outro erro pra exemplificar. Repara que a gente tá convertendo o resultado da função input() pra inteiro, mas caso o cara não digite um número, vai dar erro! Vamos descobrir qual o nome do erro.

Quando executei...

Pronto! Descobrimos que o nome desse erro é ValueError. Vamos especificar que nosso bloco exception só vai tratar esses dois tipos de erro agora...

Show! Agora, o bloco except vai tratar os dois casos: se o usuário digitar um número invalido ou se digitar zero. Por último, repara que dessa vez eu coloquei o linha que tem a função int(input()) dentro do bloco try. Isso porque só da pra gente tratar erros que acontecem dentro do bloco try, sacou?!

Palavra-chave finally

No bloco que a gente cria com a palavra-chave finally (“finalmente”, em inglês), o código vai ser executado SEMPRE. Independente de dar erro ou não no bloco try, o bloco finally vai ser executado no fim. Se o bloco try der erro, o bloco except vai ser executado ANTES do finally. Sacou?!

Na real, a ideia do bloco finally é garantir que o código vai ser executado. Depois que o erro aconteceu, pode ser que o programa siga firme e forte se você tratar aquela exceção, mas pode ser que o programa pare e dê aquele errinho das letras vermelhas. Independente disso, o bloco finally vai ser executado SEMPRE, ok?!

Usando só dois blocos

Beleza, agora que sacamos a utilidade dos três blocos, se liga que não é obrigatório a gente usar os três.

Olha, dessa forma a variável “resultado” vira zero caso dê algum erro no bloco try, mas não construímos nenhum bloco finally. Isso é ok! Assim como também é possível fazer o contrário. Olha de novo esse caso:

Se o número digitado for 0, a gente sabe que vai dar erro. Mas quando um erro ocorre, o programa imediatamente para.

Reparou que o último print() não foi executado?! Isso não acontece quando usamos o bloco finally, porque o que tá dentro do finally SEMPRE é executado, independente do que acontece no try.

O resultado:

Como não tratamos o erro no except, deu erro da mesma forma. Mas repara que mesmo assim o print() foi executado. Viu?!

Pra você mandar super bem na sua prova, é importante fazer os exercícios de fixação, ok?! To te esperando lá!

Expandir

Exercício Resolvido #1

Elaboração própria.

Faça um programa que calcule a raiz quadrada de um número n e trate os casos em que n < 0 .

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Vamos começar com um simples programa que calcula a raiz quadrada de um número:

Passo 2

Vamos agora inserir dentro de um bloco try os comandos que podem gerar erros, nesse caso a raiz quadrada de um número negativo, para que os mesmos possam ser executados sob vigilância do programa:

Passo 3

Por se tratar de uma raiz quadrada, n não pode assumir valores negativos, caso contrário teremos um erro do tipo ValueError. Por esse motivo, colocaremos um bloco de exceção para tratar erros do tipo ValueError imprimindo uma mensagem de que algo deu errado:

Resposta

Exercício Resolvido #2

Elaboração própria.

Faça um programa que calcule a divisão de dois números m e n e trate os casos em que n = 0 .

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Vamos começar com um simples programa que calcula a divisão de dois números:

Passo 2

Vamos agora inserir dentro de um bloco try os comandos que podem gerar erros, nesse caso uma divisão por 0, para que os mesmos possam ser executados sob vigilância do programa:

Passo 3

Por se tratar de uma divisão entre m e n , n não pode ser igual a 0, caso contrário teremos um erro do tipo ZeroDivisionError. Por esse motivo, colocaremos um bloco de exceção para tratar erros do tipo ZeroDivisionError imprimindo uma mensagem de que não se pode dividir um número por 0:

Resposta

Exercício Resolvido #3

Elaboração própria.

Observe o programa abaixo:

Reescreva esse código de uma forma com que ele seja capaz de tratar a inserção de um caractere por parte do usuário.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Antes de tudo, devemos saber que o erro gerado a partir da inserção de um caractere em uma requisição de número inteiro é o ValueError.

Passo 2

Tendo isso em mente, podemos simplesmente codificar o nosso programa dentro de um bloco try para que exceções do tipo ValueError sejam reconhecidas e devidamente tratadas:

No nosso caso, simplesmente imprimimos uma mensagem dizendo que o valor inserido é inválido.

Resposta

Exercício Resolvido #4

Elaboração própria.

Observe o seguinte programa:

Tendo em mente que ao executá-lo a exceção NameError é gerada, reescreva o código de forma com que tal exceção seja tratada.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Como o próprio enunciado já diz o nome da exceção gerada na execução, podemos simplesmente codificar o nosso programa dentro de um bloco try para que exceções do tipo ValueError sejam reconhecidas e devidamente tratadas:

Nesse caso, basicamente imprimimos na tela que não foi possível achar uma referência (para b ) no nosso código.

Resposta

Exercício Resolvido #5

Elaboração própria.

Observe o seguinte programa:

Qual exceção será gerada durante a sua execução ?

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Podemos observar com facilidade que o módulo math foi importado incorretamente ao utilizarmos o nome mathematics e por esse motivo que uma exceção é gerada.

Resposta

Logo, por termos uma única importação incorreta em nosso código, podemos afirmar que a exceção gerada é: ImportError.

Exercício Resolvido #6

Elaboração própria.

Observe o seguinte programa: