Maison > développement back-end > Golang > Comment puis-je vérifier de manière fiable une erreur d'annulation de demande dans Go, même si elle a été encapsulée par une autre erreur ?

Comment puis-je vérifier de manière fiable une erreur d'annulation de demande dans Go, même si elle a été encapsulée par une autre erreur ?

DDD
Libérer: 2024-11-08 04:08:01
original
301 Les gens l'ont consulté

How do I reliably check for a request cancellation error in Go, even if it has been wrapped by another error?

Vérifier l'annulation d'une demande dans Go

Dans Go, déterminer si une demande a été annulée peut être un défi. Considérez le code suivant :

package main

import (
    "context"
    "log"
    "net/http"
)

func main() {
    r, _ := http.NewRequest("GET", "http://example.com", nil)
    ctx, cancel := context.WithCancel(context.Background())
    r = r.WithContext(ctx)
    ch := make(chan bool)
    go func() {
        _, err := http.DefaultClient.Do(r)
        log.Println(err == context.Canceled)
        ch <- true
    }()
    cancel()
    <-ch
}
Copier après la connexion

Étonnamment, ce code s'affiche faux dans Go 1.9 même si la demande aurait dû être annulée.

Approche correcte

Dans les versions plus récentes de Go, une meilleure façon de vérifier l'annulation est d'utiliser la fonction error.Is introduite dans Go 1.13. Voici une version mise à jour du code :

import (
    "context"
    "errors"
    "log"
    "net/http"
)

func main() {
    // Create a context that is already canceled
    ctx, cancel := context.WithCancel(context.Background())
    cancel()

    // Create the request with it
    r, _ := http.NewRequestWithContext(ctx, "GET", "http://example.com", nil)

    // Do it, it will immediately fail because the context is canceled.
    _, err := http.DefaultClient.Do(r)
    log.Println(err) // Get http://example.com: context canceled

    // This prints false, because the http client wraps the context.Canceled
    // error into another one with extra information.
    log.Println(err == context.Canceled)

    // This prints true, because errors.Is checks all the errors in the wrap chain,
    // and returns true if any of them matches.
    log.Println(errors.Is(err, context.Canceled))
}
Copier après la connexion

En utilisant error.Is, nous pouvons vérifier de manière fiable si l'erreur sous-jacente est une erreur d'annulation de contexte, même si elle a été enveloppée par une autre erreur. La fonction error.Is parcourra toute la chaîne d'erreurs et retournera true si l'une d'entre elles correspond au type d'erreur donné.

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!

source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal