🚀 Capítulo 08: O Detetive de Erros (Tema: Brooklyn Nine-Nine)
NOTE
Este capítulo utiliza a temática de Brooklyn Nine-Nine para explicar o tratamento de erros em Go. Aprenda a investigar e tratar cada pista falsa sem deixar o programa quebrar!
1. 🎯 Objetivo da Aula
Compreender como o Go lida com erros (sem usar try/catch), o tipo primitivo error e o padrão profissional de verificação explícita de erros.
2. 🏢 O Cenário Prático (Seu Desafio)
No seriado de comédia policial Brooklyn Nine-Nine, os detetives estão sempre investigando pistas. Quando eles encontram um suspeito ou uma pista falsa, eles não entram em pânico e deixam a delegacia explodir. Eles param, analisam a pista e tomam uma decisão consciente: “Se a pista for falsa (erro), nós mudamos a estratégia! Se não tiver erro, continuamos a investigação!”
Em muitas linguagens de programação (como Python, Java ou JavaScript), quando algo dá errado, o programa lança uma “Exceção” (Exception) que quebra o programa inteiro, a menos que você coloque todo o seu código dentro de um bloco feio e gigante chamado try/catch.
- O Go odeia esse comportamento dramático e imprevisível!
- No Go, os erros são tratados como valores normais (como um número ou um texto). As funções te devolvem o resultado e, do lado, uma variável dizendo se deu erro ou não. Seu desafio é ser o detetive e investigar esses erros!
🧠 Fundamentos: A Teoria Traduzida
🕵️ 1. O Padrão if err != nil:
Este é o padrão de código que você mais vai ver e escrever na sua vida como programador Go! Ele significa: “Se o erro for diferente de nada (nil), faça algo!“.
resultado, err := dividir(10, 0)
if err != nil {
// Entrou aqui porque deu erro!
fmt.Println("Ops, deu ruim:", err)
return // Para a execução da função
}
// Se chegou aqui, é porque não deu erro!
fmt.Println("Deu tudo certo! Resultado:", resultado)❌ 2. O que é nil?
Em Go, nil (pronuncia-se “nil”) é o equivalente ao null de outras linguagens. Significa “vazio” ou “nada”. Se a variável err for igual a nil, significa que nenhum erro aconteceu!
4. 📖 Exemplo Guiado: Investigando o Arquivo
Vamos tentar ler um arquivo do computador. Essa ação pode dar erro se o arquivo não existir!
package main
import (
"fmt"
"os" // Biblioteca para mexer com o sistema operacional
)
func main() {
// Tenta ler o arquivo. Retorna os dados E o erro!
dados, err := os.ReadFile("arquivo_secreto.txt")
if err != nil {
fmt.Println("Detetive Peralta informa: Arquivo não encontrado!")
return
}
fmt.Println("Arquivo lido com sucesso! Conteúdo:", string(dados))
}5. 🛠️ Prática Obrigatória 1: O Padrão do Detetive
Imagine que você chamou uma função que conecta ao banco de dados e ela te retornou duas variáveis: conexao e err.
- Escreva a estrutura
ifclássica do Go para verificar se a conexão deu erro e imprimir a mensagem"Falha na conexão!"caso o erro exista.
6. 🛠️ Prática Obrigatória 2: Por que não temos Try/Catch?
- Com base no texto, qual a grande diferença filosófica de como o Go trata os erros em comparação com linguagens que usam o sistema de
try/catcheexceptions?
7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
- Faça o Commit: No GitHub Desktop, digite a mensagem (ex:
Finaliza Capítulo 08 Go_Brooklyn) e clique em Commit to main. - Envie para a Nuvem (Push): Clique em Push origin.
8. 📂 Estrutura de Pastas
spec_backend_com_golang_e_gin/
├── capitulos/
│ └── capitulo_08_brooklyn.md💡 Checkpoint de Lógica
Para criar os seus próprios erros personalizados em Go, você pode usar o comando errors.New("sua mensagem de erro aqui") da biblioteca padrão!
10. 🔥 Desafio de Fixação
Pesquise o que faz o comando panic em Go e por que os criadores da linguagem recomendam que você quase nunca use ele em projetos reais!
🔑 Gabarito de Código/Fórmulas
Gabarito da Prática 1:
if err != nil {
fmt.Println("Falha na conexão!")
return
}Gabarito da Prática 2:
- No Go, os erros não são “explosões” (exceptions) que quebram o fluxo do programa. Eles são apenas valores comuns retornados pelas funções. O Go força o programador a ser responsável e tratar cada erro explicitamente na hora em que ele acontece, em vez de deixar para um bloco genérico tratar depois.