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.
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.
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.
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.