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.
- Crie o arquivo
busca_tesouro.gona pastasrc/:
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
- Abra le terminal integrado.
- 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)
}
}