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
ErrDivisaoPorZerocomerrors.New. - A função
dividirretorna o erro sentinela quandob == 0. - No
main, usarerrors.Ispara 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
- Declaramos
ErrDivisaoPorZerocomo uma variável global usandoerrors.New. Isso cria um valor único que pode ser comparado em qualquer lugar. - A função
dividirverifica sebé zero. Se for, retorna0e o erro sentinela. - No
main, chamamosdividir(10, 0)e ignoramos o resultado com_. - Usamos
errors.Is(err, ErrDivisaoPorZero)para verificar se o erro é exatamente o sentinela (ou o envolve). - 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 == ErrDivisaoPorZerofunciona, mas se o erro for envolvido com%w, a comparação falha. Use sempreerrors.Is. - Esquecer de importar
errors: gera erro de compilação. - Retornar
nilem caso de erro: não retornenilquando 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