
Programação Orientada a Objetos
Exceções
Tratando erros no código
Professor Vitor Hugo · 2º ano EMI
Recap
Relembrando...
Classe, objeto, atributos, métodos o básico de POO.
Abstração modelar só o essencial.
Encapsulamento proteger os dados com __atributo e @property.
Hoje: o que fazer quando o programa encontra um erro em tempo de execução, que só aparece quando o código roda, não quando você escreve.
PROGRAMAÇÃO ORIENTADA A OBJETOS
O problema
O que acontece quando o código quebra?
app.py
def dividir(a, b):
return a / b
resultado = dividir(10, 0)
print(resultado)Saída
Traceback (most recent call last):
File "app.py", line 4, in <module>
resultado = dividir(10, 0)
File "app.py", line 2, in dividir
return a / b
ZeroDivisionError: division by zeroPROGRAMAÇÃO ORIENTADA A OBJETOS
Conceito
O que é uma exceção?
Uma exceção é o aviso que o Python dá quando algo impede a execução normal do código.
Sem tratamento, o programa para imediatamente e mostra o Traceback.
Exceção não é sempre "bug": às vezes é uma situação esperada — usuário digita algo errado, arquivo não existe, conexão cai, lista está vazia.
A ideia de hoje: prever que erros podem acontecer e decidir o que fazer quando acontecerem.
PROGRAMAÇÃO ORIENTADA A OBJETOS

Fusível, não incêndio
Numa casa sem fusível, um curto-circuito pode incendiar a fiação inteira.
Um fusível queima primeiro, isolando o problema: o resto da casa continua com luz.
Tratar exceção é isso: o "erro" ainda acontece, mas fica isolado. O programa não incendeia inteiro por causa de uma conta que não devia dar certo.
PROGRAMAÇÃO ORIENTADA A OBJETOS
Sintaxe
try / except: a sintaxe básica
app.py
try:
# código que pode dar erro
resultado = 10 / 0
except:
# o que fazer se der erro
print("Algo deu errado!")
print("O programa continua rodando normalmente.")Saída
Algo deu errado!
O programa continua rodando normalmente.
PROGRAMAÇÃO ORIENTADA A OBJETOS
Sintaxe
Reescrevendo o exemplo do início
app.py
def dividir(a, b):
try:
return a / b
except:
print("Não é possível dividir por zero!")
return None
resultado = dividir(10, 0)
print(resultado)Saída
Não é possível dividir por zero!
None
PROGRAMAÇÃO ORIENTADA A OBJETOS
Prática guiada
Prática 1
Este código quebra quando a lista está vazia.
app.py
notas = []
media = sum(notas) / len(notas)
print(media)
01Rodem e vejam o erro que aparece (vai ser ZeroDivisionError).
02Envolvam o cálculo da média num try/except.
03Em vez de deixar o programa quebrar, façam ele imprimir "Ainda não há notas cadastradas."
PROGRAMAÇÃO ORIENTADA A OBJETOS
Entrada do usuário
Nem todo erro é matemático
app.py
idade = input("Digite sua idade: ")
idade = int(idade)
print(f"Ano que vem você terá {idade + 1} anos.")Saída
>>> vinte
Traceback (most recent call last):
...
ValueError: invalid literal for int() with base 10: 'vinte'
PROGRAMAÇÃO ORIENTADA A OBJETOS
Entrada do usuário
Protegendo a leitura de dados
app.py
try:
idade = input("Digite sua idade: ")
idade = int(idade)
print(f"Ano que vem você terá {idade + 1} anos.")
except:
print("Isso não parece um número válido.")PROGRAMAÇÃO ORIENTADA A OBJETOS
Prática guiada
Prática 2
Escrevam um programa que valida uma nota.
01Pede pro usuário digitar uma nota (0 a 10).
02Converte pra número com float().
03Imprime "Aprovado" se a nota for maior ou igual a 6, senão "Reprovado".
04Se o usuário digitar algo que não é número, o programa não pode quebrar: deve imprimir "Entrada inválida, tente novamente."
Desafio extra (quem terminar antes): e se a nota digitada for um número válido, tipo 15, mas fora do intervalo de 0 a 10? Isso gera erro?
PROGRAMAÇÃO ORIENTADA A OBJETOS
Cuidado
Um problema escondido no que fizemos até agora
O except: que usamos até aqui captura qualquer erro, seja qual for.
Isso é prático, mas tem um lado ruim: se um erro inesperado acontecer, o except genérico esconde ele também, e fica bem mais difícil descobrir o que quebrou de fato.
A solução: capturar tipos específicos de erro, e usar duas palavras-chave que completam o try: else e finally.
PROGRAMAÇÃO ORIENTADA A OBJETOS
Erros comuns
Conhecendo os erros mais comuns
Exceção
Quando acontece
Exemplo
ZeroDivisionError
dividir por zero
10 / 0
ValueError
valor com tipo certo, conteúdo inválido
int("abc")
TypeError
operação entre tipos incompatíveis
"3" + 3
IndexError
índice fora dos limites de uma lista
lista[10]
KeyError
chave que não existe num dicionário
dados["telefone"]
FileNotFoundError
tentar abrir um arquivo que não existe
open("a.txt")
PROGRAMAÇÃO ORIENTADA A OBJETOS
Específico
Capturando tipos específicos
A sintaxe muda pouco: except NomeDoErro: em vez de except: sozinho.
Agora esse bloco só captura ZeroDivisionError. Qualquer outro tipo de erro não é pego aqui, e o programa quebra normalmente.
app.py
try:
resultado = 10 / 0
except ZeroDivisionError:
print("Não é possível dividir por zero!")PROGRAMAÇÃO ORIENTADA A OBJETOS
Específico
Vários except, um pra cada situação
app.py
def dividir(a, b):
try:
return a / b
except ZeroDivisionError:
print("Erro: não é possível dividir por zero.")
except TypeError:
print("Erro: os dois valores precisam ser números.")
print(dividir(10, 0))
print(dividir(10, "dois"))
print(dividir(10, 2))Saída
Erro: não é possível dividir por zero.
None
Erro: os dois valores precisam ser números.
None
Erro: os dois valores precisam ser números.
5.0
PROGRAMAÇÃO ORIENTADA A OBJETOS
Prática guiada
Prática 3
Calculadora de divisão que trata dois tipos de erro.
Se o divisor for 0, imprimir "Erro: divisão por zero não é permitida."
Se qualquer valor digitado não for número, imprimir "Erro: digite apenas números."
Dica: float() de um texto inválido gera ValueError, não TypeError — cuidado com qual tipo vocês vão capturar.
PROGRAMAÇÃO ORIENTADA A OBJETOS
Específico
Capturando vários tipos de uma vez
Às vezes dois ou mais erros merecem exatamente o mesmo tratamento. Nesse caso, dá pra agrupar num único except usando uma tupla.
app.py
try:
idade = int(input("Digite sua idade: "))
print(100 / idade)
except (ValueError, ZeroDivisionError):
print("Digite um número válido e diferente de zero.")PROGRAMAÇÃO ORIENTADA A OBJETOS
Debug
Pegando a mensagem de erro com as
as erro guarda o objeto da exceção numa variável, e dá pra usar a mensagem original que o Python gerou.
Útil principalmente durante o desenvolvimento, pra debugar. Na versão final, uma mensagem mais amigável costuma ser melhor.
app.py
try:
resultado = 10 / 0
except ZeroDivisionError as erro:
print("Deu erro:", erro)Saída
Deu erro: division by zero
PROGRAMAÇÃO ORIENTADA A OBJETOS
Ordem
Ordem importa!
app.py
try:
resultado = 10 / 0
except Exception:
print("Deu algum erro genérico.")
except ZeroDivisionError:
print("Divisão por zero especificamente.")Saída
Deu algum erro genérico.
Regra prática: sempre coloque os except mais específicos primeiro, e o genérico (se usar) por último.
PROGRAMAÇÃO ORIENTADA A OBJETOS
else / finally
else: quando nada deu errado
O bloco else roda somente se o try não gerou nenhum erro.
Deixa claro, só de olhar a estrutura, o que é "a tentativa arriscada" e o que é "o que fazer quando deu certo" — organização, não só funcionalidade.
app.py
try:
numero = int(input("Digite um número inteiro: "))
except ValueError:
print("Isso não é um número inteiro.")
else:
print(f"Muito bem! Você digitou {numero}.")PROGRAMAÇÃO ORIENTADA A OBJETOS
else / finally
finally: o que roda sempre
finally roda sempre: deu erro ou não, foi tratado ou não.
Serve pra ações que precisam acontecer de qualquer jeito: fechar um arquivo, encerrar uma conexão, liberar um recurso.
É tipo o fim de uma receita de bolo: não importa se o bolo cresceu direitinho ou desandou, você sempre lava a forma no final.
app.py
try:
numero = int(input("Digite um número: "))
print(100 / numero)
except ZeroDivisionError:
print("Não é possível dividir por zero.")
except ValueError:
print("Isso não é um número válido.")
finally:
print("Processamento encerrado.")PROGRAMAÇÃO ORIENTADA A OBJETOS
Estrutura completa
A estrutura completa, junta
app.py
try:
idade = int(input("Digite sua idade: "))
print(f"Daqui a 10 anos você terá {idade + 10} anos.")
except ValueError:
print("Por favor, digite um número inteiro.")
else:
print("Cálculo feito com sucesso!")
finally:
print("Fim do programa.")PROGRAMAÇÃO ORIENTADA A OBJETOS
Prática guiada · integradora
Prática 4
Retomem a classe ContaBancaria da aula de Encapsulamento.
01Pede um valor de saque via input() e converte com float().
02Se a entrada não for um número válido, capturem ValueError e avisem o usuário.
03Se o saque deixar o saldo negativo, tratem isso também (pode ser com if, por enquanto).
04Usem else pra confirmar o saque quando tudo deu certo.
05Usem finally pra sempre imprimir o saldo atual no final.
PROGRAMAÇÃO ORIENTADA A OBJETOS


Valeu!
Quer trocar mais uma ideia? Me chama!
vitor.silva@poa.ifrs.edu.br