Laboratório — Dados persistentes e depuração
Por que este laboratório existe
Você transformará um catálogo em programa persistente: carregar JSON, tratar ausência/erro, alterar dados, salvar e investigar falhas.
Objetivo
Integrar exceções, depuração, arquivos, JSON, módulos e organização.
Importante: não tente terminar rápido. O objetivo é observar o que acontece em cada etapa. Se algo falhar, registre a entrada, a mensagem e a correção.
Preparação
- Crie pasta
ft002-m08-labcomapp.py,core.pyedados.json. - Use UTF-8.
- Faça uma cópia do JSON antes de corrompê-lo propositalmente.
Código inicial
# app.py
import json
from pathlib import Path
ARQUIVO = Path("dados.json")
Procedimento passo a passo
- Em
core.py, crie funções para adicionar registro e calcular quantidade. - Em
app.py, crie funçãocarregar()que retorne lista vazia se o arquivo não existir. - Crie função
salvar(dados)usandojson.dump. - Execute, adicione um registro e confirme que ele permanece após fechar e abrir novamente.
- Corrompa propositalmente uma cópia do JSON e observe
JSONDecodeError. - Adicione tratamento específico que informe que o arquivo está inválido sem apagar silenciosamente os dados.
- Use
main()eif __name__ == "__main__".
Uma solução completa para comparar depois da tentativa
Tente primeiro sem consultar esta seção. Depois compare a sua versão com a solução e identifique diferenças de raciocínio, não apenas diferenças de nomes.
import json
from pathlib import Path
ARQUIVO = Path("dados.json")
def carregar():
if not ARQUIVO.exists():
return []
try:
with ARQUIVO.open("r", encoding="utf-8") as arquivo:
return json.load(arquivo)
except json.JSONDecodeError:
print("O arquivo JSON existe, mas está inválido. Corrija ou restaure o backup.")
return None
def salvar(dados):
with ARQUIVO.open("w", encoding="utf-8") as arquivo:
json.dump(dados, arquivo, ensure_ascii=False, indent=2)
def main():
dados = carregar()
if dados is None:
return
dados.append({"titulo": "Revisar FT-002", "concluida": False})
salvar(dados)
print("Registros salvos:", len(dados))
if __name__ == "__main__":
main()
Resultado esperado
O programa deve preservar dados entre execuções e tratar arquivo ausente de forma diferente de arquivo JSON corrompido.
Checklist de validação
- Consigo executar o programa do início ao fim.
- Consigo explicar o papel de cada variável, condição, laço ou função que usei.
- Testei pelo menos um caso normal, um caso de fronteira e um caso problemático quando aplicável.
- Li e entendi qualquer mensagem de erro encontrada, em vez de apenas apagar a linha.
- Meu código usa nomes que descrevem os dados e mantém entrada, regra e saída compreensíveis.
Desafio extra
Separe funções de persistência em storage.py e mantenha regras em core.py.
Critério de conclusão
Considere o laboratório concluído apenas quando você conseguir recriar a parte principal sem copiar e explicar por que cada etapa existe. “Funcionou uma vez” não é o mesmo que “eu entendi”.
Avaliação com validação humana
Receba nota e feedback individual sobre esta atividade. Este serviço é opcional e não é necessário para concluir o curso ou receber o certificado gratuito.
Entrar para solicitar