Tratamento de exceções em Python

Larissa Sales
4 min readJul 15, 2020

--

No artigo anterior desenvolvemos do zero uma calculadora em python. Neste, faremos o tratamento das exceções.

De acordo com a documentação do python, existem pelo menos dois tipos distintos de erros: erros de sintaxe e exceções.

Erros de Sintaxe:

Erros de sintaxe são aqueles que cometemos ao escrever nosso código, como por exemplo, quando esquecemos de colocar dois pontos ( : ) após a definição de uma função, veja o código abaixo:

def addition(x, y)
return x + y

Ao executarmos o programa desta forma, teremos o seguinte erro:

File "calculator_v2.py", line 4
def addition(x, y)
^
SyntaxError: invalid syntax

Conforme descrito na documentação, o parser repete a linha inválida e apresenta uma pequena ‘seta’ apontando para o ponto da linha em que o erro foi detectado. O erro é causado (ou ao menos detectado) pelo símbolo que precede a seta.

No exemplo, o erro foi detectado na função addition(), uma vez que um dois pontos ( : ) está faltando antes dela. O nome de arquivo e número de linha são exibidos para que você possa rastrear o erro no texto do script.

Exceções:

As exceções são os erros que acontecem mesmo que um comando ou expressão estejam sintaticamente corretos, ou seja, uma exceção é um erro que ocorre durante a execução do programa mas que não é fatal, um exemplo é uma regra que não foi definida. No caso da calculadora, uma exceção acontece quanto tentamos dividir um número por zero.

Traceback (most recent call last):
File "calculator_v2.py", line 17, in division
return x // y
ZeroDivisionError: integer division or modulo by zero

A documentação diz que a última linha da mensagem de erro indica o que aconteceu. Exceções surgem com diferentes tipos, e o tipo é exibido como parte da mensagem: o tipo no exemplo é ZeroDivisionError. A string exibida como sendo o tipo da exceção é o nome da exceção embutida que ocorreu.

O resto da linha é um detalhamento que depende do tipo da exceção ocorrida e sua causa.

A parte anterior da mensagem de erro apresenta o contexto onde ocorreu a exceção. Essa informação é denominada stack traceback (situação da pilha de execução). Em geral, contém uma lista de linhas do código-fonte, sem apresentar, no entanto, linhas lidas da entrada padrão.

Você pode saber mais sobre as exceções embutidas na linguagem Python consultando a documentação neste link.

Tratando as exceções da calculadora

Nossa calculadora tem duas principais exceções que trataremos neste artigo, a primeira é a “ZeroDivisionError” e a segunda “ValueError”.

O Python oferece as instruções try, except e finally para nos ajudar a lidar com os erros. Porém, na calculadora, utilizaremos apenas a construção try … except, em ambas as exceções.

ZeroDivisionError:

Como visto anteriormente, a exceção “ZeroDivisionError” ocorre quando tentamos dividir um número inteiro por zero:

Teremos o erro:

Traceback (most recent call last):
File "calculator_v2.py", line 17, in division
return x // y
ZeroDivisionError: integer division or modulo by zero

Primeiramente, vamos garantir que quando o usuário tentar fazer a divisão por zero, nossa função exiba a mensagem “Oops! Não é possível dividir por 0.”.

Para que essa mensagem seja exibida, dentro da instrução try, colocaremos o retorno que esperamos, ou seja, esperamos que nossa função consiga fazer a divisão com sucesso.

Em sequência, dentro da instrução except, colocaremos nossa mensagem para que em tempo de execução, se a função division() identificar que o divisor é 0, ela substitua a mensagem padrão da linguagem pela mensagem que queremos exibir.

E por fim, diremos para o programa finalizar a execução usando a função exit(). Essa é somente uma forma de trabalharmos com try except.

O código ficará assim:

def division(x, y):
try:
return x / y
except ZeroDivisionError:
print("\nOops! Não é possível dividir por 0.")
exit(0)

Assim, teremos:

ValueError:

A exceção “ValueError” acontece quando uma operação ou função recebe um argumento que tem o tipo certo, mas um valor inadequado, e a situação não é descrita por uma exceção mais precisa.

Um exemplo deste erro na calculadora é quando no input da opção desejada, o usuário digita uma letra ao invés de um número, neste caso, o erro acontece na conversão de string para int.

option = int(input("\nDigite sua opção (1/2/3/4): "))

Ao digitar um “x” no campo “Digite sua opção (1/2/3/4)”, teremos o erro:

Traceback (most recent call last):
File "calculator_v2.py", line 35, in <module>
option = int(input("\nDigite sua opção (1/2/3/4): "))
ValueError: invalid literal for int() with base 10: 'x'

Para forçar o usuário a inserir um número e não uma string, colocaremos a construção try…except dentro de um loop while. Ou seja, enquanto o usuário não digitar um número, exibiremos a mensagem “Oops! Não é uma opção válida. Tente novamente”

while True:
try:
option = int(input("\nDigite sua opção (1/2/3/4): "))
break

except ValueError:
print("\nOops! Não é uma opção válida. Tente novamente")

Pronto! Temos o resultado que queríamos:

Agora nossa calculadora está melhor. Caso queira praticar mais, existem outros tratamentos de erros que podemos fazer nesse mesmo programa!

Até mais! :)

--

--

No responses yet