Maison développement back-end Golang Comment utiliser élégamment Go et le contexte pour la gestion des erreurs

Comment utiliser élégamment Go et le contexte pour la gestion des erreurs

Jul 21, 2023 pm 11:37 PM
go 错误处理 优雅 context

Comment utiliser élégamment Go et le contexte pour la gestion des erreurs

Dans la programmation Go, la gestion des erreurs est une tâche très importante. La gestion des erreurs améliore gracieusement la lisibilité, la maintenabilité et la stabilité du code. Le package contextuel du langage Go nous offre un moyen très pratique de gérer les opérations liées aux erreurs. Cet article expliquera comment utiliser élégamment Go et le contexte pour la gestion des erreurs, et fournira des exemples de code pertinents.

  1. Introduction

Le mécanisme de gestion des erreurs du langage Go est implémenté en renvoyant une valeur d'erreur. Dans des circonstances normales, nous renverrons une valeur de type d'erreur dans la valeur de retour de la fonction pour indiquer si la fonction a été exécutée avec succès. Mais dans le développement réel, il y a souvent plus d’une erreur, mais plusieurs niveaux d’erreurs. À ce stade, si vous transmettez simplement toutes les valeurs d’erreur à la chaîne d’appel supérieure, le code deviendra compliqué et difficile à lire. Le package contextuel du langage Go peut nous aider à mieux gérer et propager ces erreurs.

  1. Utilisation du package context

Le package context fournit un type Context pour gérer toutes les données liées à la requête. Il peut être utilisé pour suivre le cycle de vie d'une requête et transmettre les erreurs si nécessaire. Voici un exemple de code utilisant le package de contexte pour la gestion des erreurs :

package main

import (
    "context"
    "errors"
    "fmt"
)

func main() {
    ctx := context.Background() // 创建一个根Context

    // 创建一个新的Context,并添加一些与请求相关的数据
    ctx = context.WithValue(ctx, "userID", 1001)
    ctx = context.WithValue(ctx, "isAdmin", true)

    // 调用一个模拟的业务函数,并传入Context
    err := businessFunc(ctx)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Success")
    }
}

func businessFunc(ctx context.Context) error {
    userID := ctx.Value("userID").(int)
    isAdmin := ctx.Value("isAdmin").(bool)

    if isAdmin {
        return nil
    } else {
        return errors.New("Permission denied")
    }
}
Copier après la connexion

Dans le code ci-dessus, nous créons un contexte racine, puis utilisons la méthode WithValue pour ajouter des données liées à la requête au contexte, telles que l'ID utilisateur et isAdmin. Ensuite, nous appelons une fonction métier appelée businessFunc et lui passons le Contexte en paramètre.

Dans la mise en œuvre de la fonction métier, nous obtenons les données de la demande via la méthode ctx.Value et utilisons ces données pour déterminer si nous avons l'autorisation d'effectuer certaines opérations. S'il n'y a aucune autorisation, une erreur est renvoyée.

L'avantage d'utiliser le package context est que nous pouvons transmettre les informations contextuelles de la demande à toutes les fonctions associées sans ajouter de paramètres supplémentaires à chaque fonction. Lorsque des erreurs se produisent, nous pouvons facilement les récupérer et les gérer à partir de n'importe quelle fonction.

  1. Propagation des erreurs et gestion des délais d'attente

En plus de la méthode WithValue dans l'exemple ci-dessus, le package de contexte fournit également d'autres méthodes pour propager et gérer les erreurs. Les méthodes les plus couramment utilisées sont WithCancel et WithTimeout.

WithCancel est utilisé pour créer un contexte annulable. Nous pouvons l'utiliser lorsque nous souhaitons annuler certaines opérations lorsqu'une certaine condition est remplie, ou annuler des opérations lorsqu'aucune réponse n'est reçue dans un délai donné. Voici un exemple de code qui utilise WithCancel pour expirer une fonction métier :

package main

import (
    "context"
    "errors"
    "fmt"
    "time"
)

func main() {
    ctx := context.Background()

    ctx, cancel := context.WithCancel(ctx)
    go func() {
        time.Sleep(2 * time.Second)
        cancel() // 2秒后取消操作
    }()

    err := businessFunc(ctx)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Success")
    }
}

func businessFunc(ctx context.Context) error {
    select {
    case <-ctx.Done():
        return errors.New("Timeout")
    default:
        // 执行一些操作
        time.Sleep(3 * time.Second)
        return nil
    }
}
Copier après la connexion

Dans l'exemple ci-dessus, nous utilisons WithCancel pour créer un contexte annulable et attendons 2 secondes dans une goroutine avant d'appeler la fonction d'annulation pour annuler l'opération. Dans la fonction métier, nous utilisons l'instruction select pour écouter les messages du canal ctx.Done() Si un message est reçu, cela signifie que le contexte est annulé et qu'une erreur est renvoyée.

WithTimeout est similaire à WithCancel, mais il annule automatiquement l'opération dans un certain laps de temps. Voici un exemple de code qui utilise WithTimeout pour le traitement du délai d'attente :

package main

import (
    "context"
    "errors"
    "fmt"
    "time"
)

func main() {
    ctx := context.Background()

    // 设置超时时间为2秒
    ctx, cancel := context.WithTimeout(ctx, 2*time.Second)
    defer cancel() // 到达超时时间后自动取消操作

    err := businessFunc(ctx)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Success")
    }
}

func businessFunc(ctx context.Context) error {
    select {
    case <-ctx.Done():
        return errors.New("Timeout")
    default:
        // 执行一些操作
        time.Sleep(3 * time.Second)
        return nil
    }
}
Copier après la connexion

Dans l'exemple ci-dessus, nous utilisons WithTimeout pour créer un contexte avec un délai d'attente de 2 secondes et utilisons le mot-clé defer pour appeler la fonction d'annulation avant que la fonction ne se termine. l'annuler automatiquement. Dans la fonction métier, nous utilisons l'instruction select pour écouter les messages du canal ctx.Done(). Si un message est reçu, cela signifie que le délai d'attente est atteint et qu'une erreur sera renvoyée.

  1. Résumé

En utilisant le package contextuel du langage Go, nous pouvons gérer les erreurs avec plus d'élégance et propager les informations d'erreur aux fonctions associées. Le package contextuel fournit une série de méthodes, telles que WithValue, WithCancel et WithTimeout, pour gérer facilement les opérations liées aux erreurs. Dans le développement réel, nous pouvons choisir des méthodes appropriées de gestion des erreurs en fonction de besoins et de scénarios spécifiques.

J'espère que cet article pourra aider les lecteurs à utiliser Go et le contexte pour la gestion des erreurs avec élégance, et à améliorer la lisibilité, la maintenabilité et la stabilité du 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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment faire correspondre les horodatages à l'aide d'expressions régulières dans Go ? Comment faire correspondre les horodatages à l'aide d'expressions régulières dans Go ? Jun 02, 2024 am 09:00 AM

Dans Go, vous pouvez utiliser des expressions régulières pour faire correspondre les horodatages : compilez une chaîne d'expression régulière, telle que celle utilisée pour faire correspondre les horodatages ISO8601 : ^\d{4}-\d{2}-\d{2}T \d{ 2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ . Utilisez la fonction regexp.MatchString pour vérifier si une chaîne correspond à une expression régulière.

Comment envoyer des messages Go WebSocket ? Comment envoyer des messages Go WebSocket ? Jun 03, 2024 pm 04:53 PM

Dans Go, les messages WebSocket peuvent être envoyés à l'aide du package gorilla/websocket. Étapes spécifiques : Établissez une connexion WebSocket. Envoyer un message texte : appelez WriteMessage(websocket.TextMessage,[]byte("message")). Envoyez un message binaire : appelez WriteMessage(websocket.BinaryMessage,[]byte{1,2,3}).

Comment gérer efficacement les scénarios d'erreur en C++ grâce à la gestion des exceptions ? Comment gérer efficacement les scénarios d'erreur en C++ grâce à la gestion des exceptions ? Jun 02, 2024 pm 12:38 PM

En C++, la gestion des exceptions gère les erreurs de manière gracieuse via des blocs try-catch. Les types d'exceptions courants incluent les erreurs d'exécution, les erreurs logiques et les erreurs hors limites. Prenons l'exemple de la gestion des erreurs d'ouverture de fichier. Lorsque le programme ne parvient pas à ouvrir un fichier, il lève une exception, imprime le message d'erreur et renvoie le code d'erreur via le bloc catch, gérant ainsi l'erreur sans mettre fin au programme. La gestion des exceptions offre des avantages tels que la centralisation de la gestion des erreurs, la propagation des erreurs et la robustesse du code.

La différence entre la langue Golang et Go La différence entre la langue Golang et Go May 31, 2024 pm 08:10 PM

Go et le langage Go sont des entités différentes avec des caractéristiques différentes. Go (également connu sous le nom de Golang) est connu pour sa concurrence, sa vitesse de compilation rapide, sa gestion de la mémoire et ses avantages multiplateformes. Les inconvénients du langage Go incluent un écosystème moins riche que les autres langages, une syntaxe plus stricte et un manque de typage dynamique.

Comment effectuer la gestion des erreurs et la journalisation dans la conception de classes C++ ? Comment effectuer la gestion des erreurs et la journalisation dans la conception de classes C++ ? Jun 02, 2024 am 09:45 AM

La gestion des erreurs et la journalisation dans la conception des classes C++ incluent : Gestion des exceptions : détection et gestion des exceptions, utilisation de classes d'exceptions personnalisées pour fournir des informations d'erreur spécifiques. Code d'erreur : utilisez un entier ou une énumération pour représenter la condition d'erreur et renvoyez-la dans la valeur de retour. Assertion : vérifiez les conditions préalables et postérieures et lancez une exception si elles ne sont pas remplies. Journalisation de la bibliothèque C++ : journalisation de base à l'aide de std::cerr et std::clog. Bibliothèques de journalisation externes : intégrez des bibliothèques tierces pour des fonctionnalités avancées telles que le filtrage de niveau et la rotation des fichiers journaux. Classe de journal personnalisée : créez votre propre classe de journal, résumez le mécanisme sous-jacent et fournissez une interface commune pour enregistrer différents niveaux d'informations.

Meilleurs outils et bibliothèques pour la gestion des erreurs PHP ? Meilleurs outils et bibliothèques pour la gestion des erreurs PHP ? May 09, 2024 pm 09:51 PM

Les meilleurs outils et bibliothèques de gestion des erreurs en PHP incluent : Méthodes intégrées : set_error_handler() et error_get_last() Boîtes à outils tierces : Whoops (débogage et formatage des erreurs) Services tiers : Sentry (rapport et surveillance des erreurs) Tiers bibliothèques : PHP-error-handler (journalisation des erreurs personnalisées et traces de pile) et Monolog (gestionnaire de journalisation des erreurs)

Comment éviter les fuites de mémoire dans l'optimisation des performances techniques de Golang ? Comment éviter les fuites de mémoire dans l'optimisation des performances techniques de Golang ? Jun 04, 2024 pm 12:27 PM

Les fuites de mémoire peuvent entraîner une augmentation continue de la mémoire du programme Go en : fermant les ressources qui ne sont plus utilisées, telles que les fichiers, les connexions réseau et les connexions à la base de données. Utilisez des références faibles pour éviter les fuites de mémoire et ciblez les objets pour le garbage collection lorsqu'ils ne sont plus fortement référencés. En utilisant go coroutine, la mémoire de la pile de coroutines sera automatiquement libérée à la sortie pour éviter les fuites de mémoire.

Comment utiliser le wrapper d'erreur de Golang ? Comment utiliser le wrapper d'erreur de Golang ? Jun 03, 2024 pm 04:08 PM

Dans Golang, les wrappers d'erreurs vous permettent de créer de nouvelles erreurs en ajoutant des informations contextuelles à l'erreur d'origine. Cela peut être utilisé pour unifier les types d'erreurs générées par différentes bibliothèques ou composants, simplifiant ainsi le débogage et la gestion des erreurs. Les étapes sont les suivantes : Utilisez la fonction error.Wrap pour envelopper les erreurs d'origine dans de nouvelles erreurs. La nouvelle erreur contient des informations contextuelles de l'erreur d'origine. Utilisez fmt.Printf pour générer des erreurs encapsulées, offrant ainsi plus de contexte et de possibilités d'action. Lors de la gestion de différents types d’erreurs, utilisez la fonction erreurs.Wrap pour unifier les types d’erreurs.

See all articles