Salve salve Pythonistas!
Nem sempre os programas que desenvolvemos fazem aquilo que queremos, não é mesmo?
Quem nunca supôs que determinada função iria retornar um dado de certo tipo, e se surpreendeu quando viu que o tipo de retorno era outro?
Ou quem nunca fez uma conversão de tipos de maneira incorreta e teve um ValueError
sendo lançado?
Por esses e outros motivos que devemos sempre tratar as exceções, programando de forma defensiva em Python!
E para isso, utilizamos o bloco try/except.
Na verdade, é o bloco try/except/else/finally.
Mas calma que veremos tudo nesse post!
Então sem enrolação, já prepara o café e bora nessa!
Vá direto ao assunto…
O tratamento de exceções no Python
O bloco básico de código que realiza o tratamento de exceções no Python é feito da seguinte forma:
1
2
3
4
5
6
7
8
9
10
11
try:
# Bloco de código a ser executado
except {exceção}:
# Código que será executado caso a {exceção} seja capturada
else:
# Código que será executado caso nenhuma exceção tenha sido lançada ou capturada
finally:
# Código que será executado independente se alguma exceção for capturada ou não
Apenas as cláusulas try
e except
são obrigatórias, sendo else
e finally
opcionais!
Podemos ter múltiplas cláusulas except
, capturando Exceções diferentes.
Mas vamos primeiro aos exemplos para facilitar seu entendimento!
Está curtindo esse conteúdo?
Que tal receber 30 dias de conteúdo direto na sua Caixa de Entrada?
Exemplos de utilização
Suponha que você queira abrir um arquivo e caso ele não exista, seu programa irá criá-lo.
Uma forma de fazer isso seria:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
nome_arquivo = 'nome_arquivo.txt'
try:
arquivo = open(nome_arquivo, 'r')
except FileNotFoundError:
arquivo = open(nome_arquivo, 'a')
else:
print(f"Arquivo {nome_arquivo} já existe")
finally:
# Realiza algum processamento no arquivo
processa_arquivo(arquivo)
# Fecha o arquivo
arquivo.close()
Dessa forma, caso o arquivo não exista, uma exceção FileNotFoundError
será lançada e será capturada na cláusula except
.
Ali dentro, a função open
com o parâmetro “a” (de “append”) será chamada, criando então o arquivo.
Em seguida, temos a cláusula finally
, que será executada independentemente de uma exceção ter sido lançada ou não.
Como se trata de um arquivo, é sempre aconselhado realizar seu fechamento, e um bom lugar para fazer isso é dentro do finally
.
E antes de continuarmos: você sabia que temos um módulo inteiro sobre tratamento de erros e exceções na Jornada Python - nosso curso completão? Dá uma conferida no link abaixo!
Capturando múltiplas exceções
Podemos capturar múltiplas exceções de duas formas:
A primeira, com múltiplas cláusulas except
, assim:
1
2
3
4
5
6
7
8
9
10
try:
dividendo = int(input("Digite o dividendo: "))
divisor = int(input("Digite o divisor: "))
resultado = dividendo/divisor
except ValueError:
print("Numero digitado inválido")
except ZeroDivisionError:
print("Divisão por zero não permitida")
Assim, caso o erro ValueError
seja lançado, este será capturado pelo primeiro except
.
E caso haja uma divisão por zero, a exceção ZeroDivisionError
será lançada e capturada pelo segundo except
.
Podemos também agrupar exceções! Dessa forma, o mesmo tratamento será dado independente de qual exceção tenha sido lançado, dessa forma:
1
2
3
4
5
6
7
try:
dividendo = int(input("Digite o dividendo: "))
divisor = int(input("Digite o divisor: "))
resultado = dividendo/divisor
except(ZeroDivisionError, ValueError):
print("Erro de conversão ou divisor igual à zero")
Viu como é fácil tratar erros e exceções no Python?!
Agora você não tem mais desculpa para programar da maneira correta!
Conclusão
Nesse post você viu como pode fazer o tratamento de erros e exceções no Python com o bloco try
/except
e ainda como utilizar as cláusulas else
e finally
!
Programar de maneira defensiva - capturando e tratando os erros dos programas que desenvolve - é algo que você precisa passar a fazer para progredir como Dev Python!
Espero que tenha curtido esse conteúdo e nos vemos na próxima