Tratamento de Erros
try, except e finally
Python usa try/except/else/finally para tratamento de exceções. Diferente de Java, Python usa except em vez de catch. O bloco else é executado quando nenhuma exceção ocorre. finally executa sempre, com ou sem exceção.
Exceções em Python formam uma hierarquia. Exception é a base da maioria — nunca capture BaseException ou Exception sem relançar, pois isso oculta erros. Capture sempre a exceção mais específica possível.
raise lança uma exceção manualmente. raise sem argumentos relança a exceção atual dentro de um except. É possível encadear exceções com raise NovExcecao from excecao_original para preservar o contexto.
# Tratamento básico
try:
resultado = 10 / 0
except ZeroDivisionError:
print("Divisão por zero!")
except (TypeError, ValueError) as e:
print(f"Tipo ou valor inválido: {e}")
except Exception as e:
print(f"Erro inesperado: {e}")
raise # relança — não engole silenciosamente
else:
print("Sucesso! Nenhuma exceção.")
finally:
print("Sempre executa — fechar recursos aqui")
# Lançando exceções
def dividir(a, b):
if b == 0:
raise ValueError("Divisor não pode ser zero")
return a / b
# Encadeamento de exceções
try:
dados = int("abc")
except ValueError as e:
raise RuntimeError("Falha ao processar dados") from e
# Exceção customizada
class SaldoInsuficienteError(ValueError):
def __init__(self, saldo, valor):
self.saldo = saldo
self.valor = valor
super().__init__(f"Saldo {saldo} insuficiente para sacar {valor}")
# Uso
try:
raise SaldoInsuficienteError(100, 200)
except SaldoInsuficienteError as e:
print(e.saldo, e.valor)Nunca use `except:` ou `except Exception: pass` — isso oculta bugs silenciosamente. Sempre logue ou relance exceções.