Heim >Backend-Entwicklung >Golang >Wie überprüfe ich zuverlässig, ob in Go ein Anforderungsstornierungsfehler vorliegt, auch wenn dieser durch einen anderen Fehler umschlossen wurde?

Wie überprüfe ich zuverlässig, ob in Go ein Anforderungsstornierungsfehler vorliegt, auch wenn dieser durch einen anderen Fehler umschlossen wurde?

DDD
DDDOriginal
2024-11-08 04:08:01305Durchsuche

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

Überprüfen der Stornierung einer Anfrage in Go

In Go kann es eine Herausforderung sein, festzustellen, ob eine Anfrage storniert wurde. Betrachten Sie den folgenden Code:

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
}

Überraschenderweise gibt dieser Code in Go 1.9 „false“ aus, obwohl die Anfrage hätte abgebrochen werden sollen.

Richtiger Ansatz

In neueren Versionen Eine bessere Möglichkeit zur Überprüfung auf Abbruch ist die Verwendung der Funktion „errors.Is“, die in Go 1.13 eingeführt wurde. Hier ist eine aktualisierte Version des Codes:

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))
}

Durch die Verwendung von „errors.Is“ können wir zuverlässig überprüfen, ob der zugrunde liegende Fehler ein Kontextaufhebungsfehler ist, selbst wenn er von einem anderen Fehler umschlossen wurde. Die Funktion „errors.Is“ durchläuft die gesamte Fehlerkette und gibt „true“ zurück, wenn einer von ihnen mit dem angegebenen Fehlertyp übereinstimmt.

Das obige ist der detaillierte Inhalt vonWie überprüfe ich zuverlässig, ob in Go ein Anforderungsstornierungsfehler vorliegt, auch wenn dieser durch einen anderen Fehler umschlossen wurde?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn