Capítulo 13: Tratamento de Erros 🤠💎

Neste capítulo, vamos aprender como o Go lida com erros. O Go não possui exceções (como o try/catch). Em vez disso, ele retorna o erro como um valor normal da função, com o tema Indiana Jones!


📖 Como o Go Trata Erros?

No Go, se uma função puder dar errado, ela geralmente retorna dois valores: o resultado esperado e um valor do tipo error. Se o erro for nil (nulo), significa que deu tudo certo!

O padrão mais famoso do Go é:

if err != nil {
    // Trata o erro
}

📖 Exemplo Guiado: Em busca do Santo Graal

Vamos criar uma função que busca um tesouro. Se o ID não for o correto, ela retorna um erro.

  1. Crie o arquivo busca_tesouro.go na pasta src/:
package main
 
import (
    "fmt"
    "errors" // Pacote para criar erros
)
 
func buscarTesouro(id int) (string, error) {
    if id == 7 {
        return "Santo Graal", nil // Retorna o valor e nenhum erro
    }
    return "", errors.New("Apenas poeira encontrada") // Retorna erro
}
 
func main() {
    // Tentativa 1
    tesouro1, err1 := buscarTesouro(5)
    if err1 != nil {
        fmt.Println("Tentativa 1 Erro:", err1)
    } else {
        fmt.Println("Indiana Jones encontrou o", tesouro1)
    }
 
    // Tentativa 2
    tesouro2, err2 := buscarTesouro(7)
    if err2 != nil {
        fmt.Println("Tentativa 2 Erro:", err2)
    } else {
        fmt.Println("Indiana Jones encontrou o", tesouro2)
    }
}

🕹️ Como Executar e Testar no VS Code

  1. Abra le terminal integrado.
  2. Execute: go run busca_tesouro.go

Resultado Esperado:

Tentativa 1 Erro: Apenas poeira encontrada
Indiana Jones encontrou o Santo Graal

📊 Ilustração Visual: Erro como Retorno

Veja como o Go nos obriga a tratar o erro na hora:

graph TD
    A[Função buscarTesouro] --> B{"Deu certo?"}
    B -->|Sim| C["Retorna (Valor, nil)"]
    B -->|Não| D["Retorna ('', Erro)"]

🛠️ Prática Obrigatória 1: Desarmando Armadilhas

Crie uma função chamada desarmarArmadilha(codigo int) (string, error). Se o código for 1234, retorne “Armadilha desarmada!” e nil. Se for qualquer outro número, retorne uma string vazia e um erro com a mensagem “CABUM! A armadilha disparou!“. Teste os dois casos na main.


🔑 Gabarito de Código

Prática 1: armadilha_erro.go

package main
 
import (
    "fmt"
    "errors"
)
 
func desarmarArmadilha(codigo int) (string, error) {
    if codigo == 1234 {
        return "Armadilha desarmada!", nil
    }
    return "", errors.New("CABUM! A armadilha disparou!")
}
 
func main() {
    msg, err := desarmarArmadilha(9999)
    if err != nil {
        fmt.Println("Erro:", err)
    } else {
        fmt.Println("Sucesso:", msg)
    }
 
    msg2, err2 := desarmarArmadilha(1234)
    if err2 != nil {
        fmt.Println("Erro:", err2)
    } else {
        fmt.Println("Sucesso:", msg2)
    }
}

Capitulo Anterior | Proximo Capitulo