programandoai

raise e exceções customizadas

Às vezes o erro não vem do Python, vem de uma regra do seu próprio programa sendo quebrada: um saque maior que o saldo, uma idade negativa. Nesses casos, você é quem levanta o erro, de propósito.

Estudar esta lição interativa →

Nem todo erro vem de uma operação inválida como int("abc"). Às vezes o problema é uma regra do seu próprio programa sendo quebrada: um saque maior do que o saldo disponível numa conta bancária não quebra nada do Python em si, mas é claramente um erro do ponto de vista do negócio. Para esses casos, você mesmo levanta um erro, de propósito, com raise.

def sacar(saldo, valor):
    if valor > saldo:
        raise ValueError("Saldo insuficiente para este saque.")
    return saldo - valor

print(sacar(100, 50))
print(sacar(100, 500))

raise interrompe a função imediatamente, entregando o erro para quem chamou.

raise ValueError("mensagem") reaproveita um tipo de exceção já existente do Python. Mas quando o erro representa uma regra bem específica do seu programa, criar uma exceção customizada, com um nome próprio, deixa o código mais expressivo: quem lê except SaldoInsuficienteError: entende exatamente qual problema está sendo tratado, sem precisar adivinhar a partir de um ValueError genérico.

class SaldoInsuficienteError(Exception):
    pass

def sacar(saldo, valor):
    if valor > saldo:
        raise SaldoInsuficienteError("Saldo insuficiente para este saque.")
    return saldo - valor

try:
    sacar(100, 500)
except SaldoInsuficienteError as erro:
    print(f"Saque recusado: {erro}")

Uma exceção customizada só precisa herdar de Exception.

Pense numa exceção customizada como uma etiqueta de erro feita sob medida, em vez de usar sempre o mesmo rótulo genérico "algo deu errado" para qualquer problema. Um pote de vidro rachado e uma fruta vencida são dois problemas bem diferentes numa despensa; etiquetá-los de formas diferentes ajuda quem for lidar com cada um a saber exatamente o que fazer, em vez de abrir cada pote para descobrir.

class NomeDoErro(Exception): pass já é uma exceção válida

Uma exceção customizada não precisa de nenhum código extra dentro dela para funcionar: class SaldoInsuficienteError(Exception):\n pass já é suficiente para criar um novo tipo de erro, com nome próprio, que pode ser lançado com raise e capturado com except exatamente como qualquer exceção embutida do Python. A palavra class cria um novo "tipo" de coisa em Python; o Módulo 10 ensina classes com calma, e por enquanto basta copiar esse molde de duas linhas, trocando só o nome.

Esquecer de herdar de Exception quebra o raise

Toda exceção customizada em Python precisa herdar, direta ou indiretamente, de Exception (a classe-base dos erros que um programa normalmente captura; a raiz de todas as exceções é BaseException, que também inclui sinais como KeyboardInterrupt, e por isso não se herda dela). Uma classe declarada sem herdar de Exception (ou de alguma exceção já existente) não pode ser usada com raise, e o Python recusa a tentativa. A sintaxe class MeuErro(Exception):, com Exception entre parênteses, é o que garante essa conexão.

def validar_idade(idade):
    if idade < 0:
        raise ValueError("Idade não pode ser negativa.")
    return idade

try:
    validar_idade(-5)
except ValueError as erro:
    print(f"Erro: {erro}")

Complete o raise dentro de validar_idade.

Complete a função dividir_seguro(a, b): se b for zero, capture o ZeroDivisionError internamente e devolva a string "Erro: divisão por zero"; caso contrário, devolva o resultado normal da divisão (um float).
def dividir_seguro(a, b):
    try:
        # tente dividir a por b e retorne o resultado
        pass
    except ZeroDivisionError:
        # retorne a mensagem de erro combinada
        pass

🧩 Este é um exercício com correção automática — abra no app para completá-lo e verificar.

← Voltar ao índice do curso