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?
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.
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!