Tratamento de exceções em Python
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! :)