Utilizando ponteiro e referência, podemos retornar a struct que representa nosso erro customizado
e acessar suas informações como parte do tratamento para exibição. A função errors.As do
package errors é utilizado para validação.
Modificamos o nosso 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 nosso erro, adicionamos o retorno de uma referência para a struct de 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 customizado lançado e exibimos suas informações.
Sintaxe: errors.As
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 nesta parte:
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) { //referência
fmt.Printf("msg:%s\ncodigo:%d",mErro.msg,mErro.codigo)
}else{
fmt.Printf("OK, sem bugs" )
}
}
Saída
erro:
codigo: 0
msg: valor < 0