Fácil Go

Erro sentinela para divisão por zero

Enunciado

Crie um erro sentinela ErrDivisaoPorZero e uma função dividir(a, b float64) (float64, error) que retorna esse erro quando b for zero. No main, chame a função com b=0 e verifique o erro com errors.Is.

Requisitos

  • Definir a variável ErrDivisaoPorZero com errors.New.
  • A função dividir retorna o erro sentinela quando b == 0.
  • No main, usar errors.Is para verificar o erro e imprimir uma mensagem.

Código inicial

package main

import (
	"errors"
	"fmt"
)

// Defina ErrDivisaoPorZero aqui

func dividir(a, b float64) (float64, error) {
	// Implemente
	return 0, nil
}

func main() {
	// Chame dividir(10, 0) e trate o erro
}

Saída esperada

Erro: divisão por zero
Ver dica

Use errors.New("divisão por zero") e retorne 0, ErrDivisaoPorZero quando b == 0.

Mostrar solução
package main

import (
	"errors"
	"fmt"
)

// ErrDivisaoPorZero é um erro sentinela.
var ErrDivisaoPorZero = errors.New("divisão por zero")

func dividir(a, b float64) (float64, error) {
	if b == 0 {
		return 0, ErrDivisaoPorZero
	}
	return a / b, nil
}

func main() {
	_, err := dividir(10, 0)
	if errors.Is(err, ErrDivisaoPorZero) {
		fmt.Println("Erro: divisão por zero")
	}
}

Passo a passo

  1. Declaramos ErrDivisaoPorZero como uma variável global usando errors.New. Isso cria um valor único que pode ser comparado em qualquer lugar.
  2. A função dividir verifica se b é zero. Se for, retorna 0 e o erro sentinela.
  3. No main, chamamos dividir(10, 0) e ignoramos o resultado com _.
  4. Usamos errors.Is(err, ErrDivisaoPorZero) para verificar se o erro é exatamente o sentinela (ou o envolve).
  5. Se for, imprimimos a mensagem.

Por que funciona

Erros sentinela são valores exportados que podem ser comparados com errors.Is. Isso permite que quem chama a função tome decisões baseadas no tipo de erro, sem depender da string de mensagem.

Erros comuns

  • Comparar diretamente com ==: if err == ErrDivisaoPorZero funciona, mas se o erro for envolvido com %w, a comparação falha. Use sempre errors.Is.
  • Esquecer de importar errors: gera erro de compilação.
  • Retornar nil em caso de erro: não retorne nil quando houver falha; retorne o erro.

Outra forma de resolver

Poderia usar fmt.Errorf("divisão por zero") diretamente, mas sem uma variável sentinela não seria possível verificar com errors.Is de forma robusta.

Saída esperada

Erro: divisão por zero