Golang: Como funciona o tratamento de erros?
golang
Em Go (Golang), não existe um mecanismo try-catch como em linguagens de programação tradicionais como Java ou JavaScript. Em vez disso, Go adota uma abordagem única para o tratamento de erros que se baseia no retorno explícito de erros a partir das funções.
📖
Antes de prosseguir com a leitura deste conteúdo recomendo a leitura prévia do Go (GoLang): Primeiros Passos

Filosofia do Tratamento de Erros em Go

A filosofia de Go é simplificar o fluxo de controle e tornar o tratamento de erros explícito e evidente no código. Isso resulta em um código que é mais fácil de ler e entender, pois todas as possíveis falhas são tratadas de forma explícita ao invés de serem capturadas implicitamente.

Estrutura de Erros em Go

Go define uma interface error que qualquer tipo de erro deve implementar. A interface é simples:
type error interface { Error() string }
Você pode criar erros personalizados implementando essa interface. Aqui está um exemplo básico de um erro personalizado:
package main import ( "fmt" ) type MeuErro struct { Mensagem string } func (e *MeuErro) Error() string { return e.Mensagem } func dividir(a, b float64) (float64, error) { if b == 0 { return 0, &MeuErro{Mensagem: "divisão por zero"} } return a / b, nil } func main() { resultado, err := dividir(4, 0) if err != nil { fmt.Println("Erro:", err) return } fmt.Println("Resultado:", resultado) }

Tratamento de Erros com if

O padrão mais comum de tratamento de erros em Go envolve verificar se a função retornou um erro e, em caso afirmativo, lidar com ele imediatamente:
package main import ( "errors" "fmt" ) func dividir(a, b float64) (float64, error) { if b == 0 { return 0, errors.New("divisão por zero") } return a / b, nil } func main() { resultado, err := dividir(4, 0) if err != nil { fmt.Println("Erro:", err) return } fmt.Println("Resultado:", resultado) }

Tratamento de Panics

Além dos erros, Go também possui o conceito de panic, que são utilizados para indicar situações excepcionais que normalmente representam falhas graves. panic deve ser usado com cautela e em situações onde a continuação da execução do programa não é segura. É possível capturar um panic usando a função recover:
package main import ( "fmt" ) func podePanicar() { defer func() { if r := recover(); r != nil { fmt.Println("Recuperado do panic:", r) } }() panic("um problema ocorreu") } func main() { fmt.Println("Início") podePanicar() fmt.Println("Fim") }

Exemplo Prático: Acesso a Banco de Dados

Vamos aplicar o que aprendemos em um exemplo prático envolvendo acesso a um banco de dados. Este exemplo mostra como conectar a um banco de dados PostgreSQL e lidar com possíveis erros durante a conexão.
package main import ( "database/sql" "fmt" "log" _ "github.com/lib/pq" ) func conectarBD() (*sql.DB, error) { connStr := "user=usuario dbname=meubanco sslmode=disable" db, err := sql.Open("postgres", connStr) if err != nil { return nil, err } return db, nil } func main() { db, err := conectarBD() if err != nil { log.Fatal("Erro ao conectar no banco de dados:", err) } defer db.Close() // Uso do banco de dados fmt.Println("Conexão bem-sucedida!") }
 
Embora Go não tenha um mecanismo try-catch convencional, sua abordagem de tratamento de erros oferece uma maneira clara e direta de lidar com falhas. O uso explícito de erros como valores de retorno torna o código mais legível e facilita a identificação e correção de problemas. Adotar essa filosofia de tratamento de erros pode levar a um código mais robusto e de fácil manutenção.
Esta abordagem pode parecer diferente para desenvolvedores vindos de outras linguagens, mas com prática, torna-se uma ferramenta poderosa e eficaz para escrever código Go de alta qualidade.
 

Aprenda programação do zero e DE GRAÇA

No Discover você vai descomplicar a programação, aprender a criar seu primeiro site com a mão na massa e iniciar sua transição de carreira.

COMECE A ESTUDAR AGORA