Maison  >  Article  >  développement back-end  >  Quand « json.Marshal » renvoie-t-il une erreur non-panique ?

Quand « json.Marshal » renvoie-t-il une erreur non-panique ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-01 06:34:31188parcourir

When Does `json.Marshal` Return a Non-Panic Error?

Gestion des erreurs json.Marshal : comprendre les erreurs induites par les entrées

La fonction json.Marshal, comme souligné dans la documentation, ne parvient pas à gérer les erreurs cycliques. structures de données, conduisant à des paniques d'exécution. Bien qu'il s'agisse d'un scénario courant, il est possible de rencontrer des situations dans lesquelles une erreur non-panique est générée à la place.

Génération d'erreur provoquant une entrée

Pour illustrer un scénario non-panique. scénario de panique, considérons l'exemple suivant :

<code class="go">type Node struct {
    Value int
    Next  *Node
}

func main() {
    node1 := Node{1, nil}
    node2 := Node{2, &node1}
    node1.Next = &node2

    _, err := json.Marshal(node1)
    if err != nil {
        fmt.Printf("Error encountered: %v\n", err)
    }
}</code>

Résultat :

Le programme ci-dessus s'exécutera sans panique et renverra à la place l'erreur : json : type non pris en charge : * main.Node

Types d'erreurs

La fonction json.Marshal peut générer deux types d'erreurs :

  • UnsupportedTypeError : Se produit lorsqu'un type non valide est transmis, tel qu'un canal ou une fonction.
  • UnsupportedValueError : Déclenché lorsqu'une valeur non valide est fournie, telle que l'infini.

Dans l'exemple donné, l'erreur entre dans la catégorie UnsupportedValueError, car elle concerne une valeur non valide (structure de données cyclique) plutôt qu'un type non valide.

Exemples supplémentaires :

Voici quelques scénarios supplémentaires qui peuvent amener json.Marshal à renvoyer des erreurs non nulles :

<code class="go">_, err := json.Marshal(nil)  // Error: json: unsupported value: nil
_, err := json.Marshal(1e100) // Error: json: unsupported value: 1e+100, must be finite</code>

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn