🚀 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.

  1. Escreva a estrutura if clá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?

  1. 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/catch e exceptions?

7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)

  1. Faça o Commit: No GitHub Desktop, digite a mensagem (ex: Finaliza Capítulo 08 Go_Brooklyn) e clique em Commit to main.
  2. 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:

  1. 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.

Capitulo Anterior | Proximo Capitulo