Exceções e tratamento de entradas

Tratar falhas previsíveis sem esconder erros inesperados.

Exceções e tratamento de entradas

Objetivo da aula

Tratar falhas previsíveis sem esconder erros inesperados.

Regra desta aula: vamos assumir que você nunca viu este assunto antes. Nenhum termo importante será usado sem explicação e todo exemplo deve ser entendido linha por linha, não apenas copiado.

Começando do zero

Exceção é um evento que interrompe o fluxo normal porque uma operação não pôde ser concluída. try/except permite tratar falhas previstas, como o usuário digitar texto onde esperávamos número. O objetivo não é esconder erros; é responder de forma controlada aos problemas que realmente sabemos reconhecer.

Uma imagem mental para entender

Imagine uma catraca que tenta ler um cartão. Se o cartão estiver ilegível, a máquina não precisa explodir nem fingir que funcionou; pode mostrar “cartão inválido, tente novamente”. Tratamento de exceção é essa reação planejada para uma falha conhecida.

Conceitos essenciais, sem pular etapas

try

Contém a menor região prática onde uma exceção esperada pode ocorrer.

except ValueError

Trata especificamente conversões inválidas e outras operações que levantem esse tipo dentro do bloco.

Captura específica

Evite except: genérico neste nível. Capturar tudo pode esconder erros de programação que você deveria investigar.

Mensagem útil

Explique o que a pessoa pode corrigir: “digite um número inteiro” é melhor que “erro”.

Separar erro esperado de bug

Entrada humana inválida é esperável. Um NameError por variável escrita errado geralmente é bug e não deve ser silenciado como se fosse entrada ruim.

Modelo mental

OPERAÇÃO PREVISTA COMO ARRISCADA → SUCESSO: CONTINUA | EXCEÇÃO ESPECÍFICA: TRATA

Exemplo 1 — primeiro veja o programa inteiro

texto = input("Digite uma idade inteira: ")

try:
    idade = int(texto)
    print("Idade recebida:", idade)
except ValueError:
    print("Entrada inválida. Digite apenas um número inteiro, como 25.")

Agora vamos ler linha por linha

  • A operação arriscada é a conversão int(texto).
  • Se funcionar, a execução continua dentro do try e mostra a idade.
  • Se a conversão levantar ValueError, o fluxo pula para o bloco correspondente.
  • O programa não inventa um valor; informa a falha e mantém a situação explícita.

Saída esperada

A saída depende do texto digitado.

Exemplo 2 — o mesmo conceito em outra situação

def ler_inteiro(texto):
    try:
        return int(texto)
    except ValueError:
        return None

valor = ler_inteiro("abc")
if valor is None:
    print("Não foi possível converter")

Esta função transforma uma falha esperada em um resultado explícito None. Em programas maiores, outras estratégias podem ser melhores, mas aqui a ideia é separar conversão da interface.

Experimento guiado

Não pule esta parte. Programação só começa a fazer sentido quando você prevê um resultado, executa e compara a previsão com o que realmente aconteceu.

  1. Teste entradas “25”, “25.5” e “vinte”.
  2. Leia o tipo da exceção quando não houver try/except, depois restaure o tratamento.
  3. Mantenha dentro do try somente a operação que realmente pode gerar o ValueError esperado.
  4. Nunca use except: pass para “fazer o erro sumir” sem entender a consequência.

Mini desafio

Escreva um trecho que tente converter preço para float. Se falhar, mostre uma mensagem orientando o formato “12.50”.

Solução comentada

texto = input("Preço (ex.: 12.50): ")
try:
    preco = float(texto)
    print(f"Preço: {preco:.2f}")
except ValueError:
    print("Preço inválido. Use números e ponto decimal, por exemplo 12.50.")

Depois de executar a solução, altere pelo menos um valor e explique por que o novo resultado mudou. Se você só copiou e não consegue explicar cada linha, refaça o desafio em uma versão menor.

Erros comuns e por que acontecem

  • Capturar todas as exceções e esconder bugs.
  • Colocar centenas de linhas dentro de um único try e não saber qual operação falhou.
  • Usar valor padrão silencioso como 0 após entrada inválida e produzir cálculos enganadores.
  • Mostrar apenas “erro” sem dizer ao usuário como corrigir a entrada.

Cheque se você realmente entendeu

Qual exceção é comum em int("abc")?

Resposta: ValueError.

Por que evitar except: genérico?

Resposta: Porque pode capturar e esconder falhas que não eram o problema previsto.

Tratamento de exceção substitui validação de faixa?

Resposta: Não. Converter com sucesso e estar dentro da regra são etapas diferentes.

Resumo em linguagem simples

Nesta aula, o ponto central foi Exceções e tratamento de entradas. Tente explicar o modelo OPERAÇÃO PREVISTA COMO ARRISCADA → SUCESSO: CONTINUA | EXCEÇÃO ESPECÍFICA: TRATA sem olhar a tela. Depois, escreva um exemplo próprio menor que os apresentados. Esse exercício de explicação é parte do aprendizado, não um extra.

Conexão com a próxima aula

Na próxima aula, Depuração orientada por evidências, vamos aproveitar exatamente o que foi construído aqui. Você não precisa memorizar tudo; precisa conseguir reconhecer o conceito e reconstruí-lo com raciocínio e testes.