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.