Tratamento de Erros
Go não tem try/catch nem exceptions para tratamento de erros comum. Em vez disso, uma function que pode falhar simplesmente retorna um error como um valor extra, e quem a chamou verifica isso explicitamente — error é apenas uma interface com um method, Error() string.
package main
import (
"errors"
"fmt"
)
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}
func main() {
result, err := divide(10, 2)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
}Result: 5
Verificar err não é opcional, por convenção
if err != nil logo após uma chamada que retorna um error é um dos padrões mais comuns em qualquer base de código Go. Não há imposição no nível da linguagem, mas código Go idiomático verifica todo error que recebe de volta, bem onde ele é retornado.
package main
import (
"errors"
"fmt"
)
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}
func main() {
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
}Error: cannot divide by zero
A seguir: defer, panic, e recover — o mecanismo estreito e deliberadamente limitado do Go parecido com exceptions.
Practice exercise
Escreva uma function safeDivide(a, b float64) (float64, error) que retorne um error "cannot divide by zero" se b for 0, caso contrário a/b e nil. Chame-a com (10, 0), e imprima o error se houver um.