Utilizando ponteiro e referência, podemos retornar a struct contendo os dados do erro e acessar
suas informações, como parte do tratamento, para exibição. O método errors.As do package errors
é utilizado para validação do erro.
Modificamos o método Error do exemplo anterior para o mostrado abaixo:
Ex 8:
//metodo da interface error
func (e MeuErro) Error() string {
return e.msg
}
Na função que retorna o erro adicionamos o retorno de uma referência ao nosso erro:
Ex 9:
//função p/ retorno de erro
func funcao(p int) (int, error) {
if p < 0 {
return 0, &MeuErro {codigo: 0, msg:"valor < 0 "} //referência p/ erro
}
return p*2, nil
}
Em nossa main, alteramos o tratamento adicionando o método errors.As para validação do nosso
erro lançado e exibição de suas informações.
Sintaxe
func As(err error, target any) bool
Ex 10:
func main() {
_,erro :=funcao(-1);
var mErro *MeuErro; //ponteiro
if errors.As(erro, &mErro) {
fmt.Printf("msg:%s\ncodigo:%d",mErro.msg,mErro.codigo)
}
}
Abaixo, o código final contendo os trechos de código mostrados neste tópico:
Ex 11:
package main
import "fmt"
import "errors"
//novo tipo
type MeuErro struct{
codigo int
msg string
}
//método da interface error
func (e MeuErro) Error() string {
return e.msg
}
//função p/ retorno de erro
func funcao(p int) (int, error) {
if p < 0 {
return 0, &MeuErro {codigo: 0, msg:"valor < 0 "}
}
return p*2, nil
}
func main() {
_,erro :=funcao(-1);
var mErro *MeuErro; //ponteiro
if errors.As(erro, &mErro) {
fmt.Printf("msg:%s\ncodigo:%d",mErro.msg,mErro.codigo)
}
}
Saída
erro:
codigo: 0
msg: valor < 0