Maison >développement back-end >Golang >Allez - Erreur. Impossible de décompresser le type d'erreur personnalisé

Allez - Erreur. Impossible de décompresser le type d'erreur personnalisé

王林
王林avant
2024-02-09 16:45:18856parcourir

Go - 错误。无法解包自定义错误类型

L'éditeur php Xigua vous présentera : Dans le langage Go, lorsque nous utilisons des types d'erreur personnalisés, nous rencontrons parfois le problème de "Erreur. Impossible de décompresser les types d'erreur personnalisés". Ce problème se produit généralement lorsque nous essayons de transmettre des types d'erreur personnalisés à d'autres fonctions ou méthodes. Même si cela peut sembler un problème délicat, il existe en réalité plusieurs façons de le résoudre. Dans cet article, nous explorerons les causes de ce problème et proposerons des solutions pour vous aider à résoudre ce problème.

Contenu de la question

J'essaie d'utiliser les erreurs du package go stdlib pour décompresser un type d'erreur personnalisé à l'aide de errors.as mais il semble que la vérification échoue et je ne peux pas extraire l'erreur sous-jacente.

J'ai extrait un exemple minimal reproductible :

package main

import (
    "errors"
    "fmt"
)

type myError struct {
    err error
}

func (m myError) Error() string {
    return fmt.Sprintf("my error: %s", m.err)
}

func retError() error {
    return &myError{errors.New("wrapped")}
}

func main() {
    var m myError
    if err := retError(); errors.As(err, &m) {
        fmt.Println("unwrapped", m.err)
    } else {
        fmt.Println(err)
    }
}

https://go.dev/play/p/i7bnk4-rdib - Exemples sur le terrain de jeu en déplacement. S'il est lancé, il affiche "mon erreur : emballage" au lieu de l'"emballage non emballé" attendu.

errors.as 文档中的示例有效,我似乎无法理解我做错了什么 - 我将 *myerror 传递给 errors.as,这似乎是正确的(因为传递了 myerror引发恐慌:target 必须是非零指针 L'exemple dans la documentation fonctionne, je n'arrive pas à comprendre ce que je fais de mal - je passe *myerror à ce qui semble être correct (car en passant myerror lance Panic : <code>la cible doit être un pointeur différent de zéro, c'est normal).

Solution

au lieu de :

func reterror() error {
    return &myerror{errors.new("wrapped")}
}

Faire : 🎜
func retError() error {
    return myError{errors.New("wrapped")}
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer