AnyCompiler

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)
	}
}
Output
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)
	}
}
Output
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.