3.1 Captura de Exceções
A gente não falaria tanto sobre exceções se só precisássemos observar elas. Exceções são objetos especiais que seu programa em Python pode trabalhar. O tratamento de exceções é um aspecto importante da programação que melhora a confiabilidade e a robustez dos programas.
Em Python, para capturar e tratar exceções a gente usa as construções
try
, except
, else
e
finally
. Essas construções permitem interceptar erros
que ocorrem durante a execução do programa e tomar as ações apropriadas.
Construção try-except
A construção try-except
é usada para capturar e tratar
exceções. O bloco try
contém o código que pode gerar
uma exceção, e o bloco except
contém o código que será executado
se ocorrer uma exceção.
Exemplo:
try:
result = 10 / 0
except ZeroDivisionError:
print("Erro: divisão por zero.")
Se no código dentro do bloco try
ocorrer a exceção
ZeroDivisionError
, ela será capturada pelo bloco except
e o código
com a chamada print()
será executado.
Tratamento de múltiplas exceções
Você pode tratar vários tipos de exceções especificando-os em blocos
separados except
.
try:
result = int("abc")
except ZeroDivisionError:
print("Erro: divisão por zero.")
except ValueError:
print("Erro: valor inválido.")
Captura de todas as exceções
Se você desejar capturar todas as exceções, pode usar o bloco
except
sem especificar um tipo de exceção específico. No entanto, isso não
é recomendado, pois pode dificultar a depuração e esconder erros importantes.
try:
result = 10 / 0
except:
print("Ocorreu um erro.")
3.2 Operadores else
e finally
Além dos operadores try
e except
, temos mais dois
opcionais: else
e finally
. Agora vou explicar
um pouco mais sobre eles.
Construção try-except-else
Bloco else
é usado para executar código,
caso não ocorra exceção no bloco try
.
try:
result = 10 / 2
except ZeroDivisionError:
print("Erro: divisão por zero.")
else:
print(f"Resultado: {result}")
Construção try-except-finally
Bloco finally
contém código que será
executado independentemente de ocorrer uma exceção ou não. Isso é útil para
liberar recursos ou realizar operações de finalização.
try:
result = 10 / 0
except ZeroDivisionError:
print("Erro: divisão por zero.")
finally:
print("Este bloco sempre é executado.")
Exemplo completo: try-except-else-finally
Exemplo:
try:
result = 10 / 2
except ZeroDivisionError:
print("Erro: divisão por zero.")
else:
print(f"Resultado: {result}")
finally:
print("Este bloco sempre é executado.")
3.3 Exemplo try-except-else-finally
Vamos analisar um exemplo real. Por exemplo, estamos tentando ler dados de um arquivo no disco — o que pode ser mais simples?
file = open("file.txt", "r")
content = file.read()
print(content)
O que pode dar errado? Por exemplo, tudo:
- O arquivo pode não existir. Ele pode ter sido apagado acidentalmente, não gravado, ou seu programa está sendo executado em outro computador onde ele nunca existiu.
- Erro de leitura do arquivo. Seu programa não tem acesso a ele, pois está em um diretório que requer permissões administrativas.
- Outro programa está escrevendo neste arquivo agora e não pode ser lido — ele tem acesso exclusivo ao arquivo.
Parece suficiente? Então não esqueça que, independentemente da etapa em que ocorreu o erro ao trabalhar com o arquivo, você deve "fechar" ele para que o sistema operacional libere os recursos alocados para trabalhar com este arquivo.
Então, o código real ficará mais ou menos assim:
try:
file = open("non_existent_file.txt", "r")
content = file.read()
except FileNotFoundError:
print("Erro: arquivo não encontrado.")
except IOError:
print("Erro: erro de entrada/saída.")
else:
print(content)
finally:
if 'file' in locals() and not file.closed:
file.close()
print("Arquivo fechado.")
Bem-vindo ao mundo real, onde você precisa escrever código não apenas para o "cenário de trabalho", mas também para todos os cenários possíveis que podem dar errado.
Não se assuste — é mais simples do que parece. Basta
entender o que são condições de contorno (corner cases
) e adicionar
verificações de erros padrão na hora certa. O resto, as frameworks modernas fazem por
você.
GO TO FULL VERSION