Tratamento de exceções
Exceções são eventos que ocorrem durante a execução de um programa e interrompem o fluxo normal do código, geralmente devido a erros, como tentar dividir por zero, aceder a um índice inexistente numa lista ou abrir um ficheiro que não existe, por exemplo.
O tratamento de exceções é fundamental para tornar programas em Python mais robustos, evitando que erros inesperados interrompam a sua execução e permitindo respostas adequadas a situações imprevistas.
Blocos Básicos: try
e except
A maneira mais simples de tratar exceções em Python é usando os blocos try
e except
:
try:
# Código que pode gerar uma exceção
print(x)
except: #exceção genérica
print("Uma exceção ocorreu!")
Neste exemplo, como x
não está definido, o bloco except
será executado, exibindo a mensagem de erro.
Tratar exceções específicas
Podemos capturar tipos específicos de exceções para lidar com diferentes erros de maneira personalizada:
try:
resultado = 10 / 0
except ZeroDivisionError:
print("Divisão por zero não permitida.")
Podemos adicionar múltiplos blocos except
para diferentes tipos de erro:
try:
numero = int(input("Digite um número: "))
resultado = 10 / numero
except ZeroDivisionError:
print("Divisão por zero não é permitida.")
except ValueError:
print("Você não digitou um número válido.")
except Exception as err: #exceção genérica
print(err)
Blocos else
e finally
- else: Executado se nenhuma exceção for lançada no bloco
try
. - finally: Sempre executado, independentemente de ocorrer ou não uma exceção.
try:
print("Executando operação segura.")
except Exception:
print("Erro detectado.")
else:
print("Nenhum erro ocorreu.")
finally:
print("Este bloco sempre será executado.")
O bloco finally
é útil, por exemplo, para fechar ficheiros ou libertar recursos, por exemplo, garantindo que certas ações ocorram sempre.
Levantando Exceções com raise
Podemos levantar as nossas próprias exceções quando detetarmos condições inadequadas:
valor = 2000
if valor > 1000:
raise ValueError("Por favor, insira um valor menor que 1.000")
Criar Exceções Personalizadas
Para cenários específicos, podemos criar exceções personalizadas criando uma classe que seja subclasse da classe Exception
:
class MinhaExcecao(Exception):
def __init__(self, mensagem):
self.mensagem = mensagem
try:
raise MinhaExcecao("Erro específico do domínio.")
except MinhaExcecao as e:
print(f"Exceção personalizada capturada: {e.mensagem}")
finally:
print("Finalizando operação.")
Melhores Práticas
- Trate sempre exceções específicas antes das genéricas.
- Use o bloco
finally
para libertar recursos. - Evite capturar exceções genéricas sem necessidade, pois isso pode mascarar erros inesperados.