Go Academy · Leçon

Gestion des erreurs et logique de nouvelle tentative

Vérifier les codes d’état et implémenter de nouvelles tentatives

Leçon 4 sur 413 étapes

Gestion des erreurs et logique de nouvelle tentative est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.

Les erreurs HTTP ne sont pas des erreurs Go

Un code d’état HTTP 404 ou 500 n’est pas une erreur Go : http.Client.Do renvoie une erreur nulle pour toute réponse HTTP valide. Vérifiez explicitement resp.StatusCode.

Encapsuler les erreurs

Encapsulez les erreurs avec un contexte à l’aide de fmt.Errorf("operation: %w", err) afin que les appelants puissent examiner la cause avec errors.Is / errors.As.

if err != nil {
    return fmt.Errorf("fetch users: %w", err)
}

Erreurs réessayables ou non réessayables

Réessayez en cas de délais d’attente réseau, de 429 Too Many Requests ou de 503 Service Unavailable. Ne réessayez pas en cas de 400 Bad Request, 401 Unauthorized ou 404 Not Found : une nouvelle tentative n’aidera pas.

Temporisation exponentielle

Attendez plus longtemps entre chaque nouvelle tentative afin de réduire la charge sur un serveur en difficulté. Voici une implémentation simple :

for i := 0; i < maxRetries; i++ {
    resp, err := client.Do(req)
    if err == nil && resp.StatusCode < 500 { break }
    time.Sleep(time.Duration(math.Pow(2, float64(i))) * time.Second)
}

Gigue

Ajoutez une gigue aléatoire à la temporisation afin d’empêcher plusieurs clients de réessayer simultanément (effet de troupeau).

wait := time.Duration(math.Pow(2, float64(i)))*time.Second + time.Duration(rand.Intn(1000))*time.Millisecond

En-tête Retry-After

La réponse 429 contient souvent un en-tête Retry-After. Analysez-le et respectez sa valeur plutôt que d’utiliser une temporisation fixe.

retryAfter := resp.Header.Get("Retry-After")
if secs, err := strconv.Atoi(retryAfter); err == nil {
    time.Sleep(time.Duration(secs) * time.Second)
}

Nouvelles tentatives tenant compte du contexte

Vérifiez le contexte avant chaque tentative afin d’arrêter les nouvelles tentatives si la requête a été annulée.

for i := 0; i < maxRetries; i++ {
    if ctx.Err() != nil { return nil, ctx.Err() }
    // attempt
}

Types d’erreur personnalisés

Définissez des erreurs HTTP typées pour transporter le code d’état et le corps, afin de permettre aux appelants de prendre des décisions détaillées concernant les nouvelles tentatives.

type HTTPError struct {
    Status int
    Body   string
}
func (e *HTTPError) Error() string { return fmt.Sprintf("HTTP %d: %s", e.Status, e.Body) }

Options de bibliothèques

Envisagez hashicorp/go-retryablehttp ou cenkalti/backoff pour gérer les nouvelles tentatives en production, avec des politiques de temporisation configurables, un nombre maximal de tentatives et la prise en charge du contexte.

Clés d’idempotence

Pour les requêtes POST réessayées, incluez un en-tête contenant une clé d’idempotence (UUID) afin que le serveur déduplique les nouvelles tentatives et renvoie le même résultat sans créer de ressources en double.

Coupe-circuit

Un coupe-circuit suit les taux d’échec et cesse d’envoyer des requêtes à un service défaillant pendant une période de refroidissement. Des bibliothèques comme sony/gobreaker implémentent ce modèle.

Vérification rapide

Pourquoi devez-vous ajouter une gigue à une temporisation exponentielle ?

Récapitulatif&nbsp;: gestion des erreurs et nouvelles tentatives

Points clés :

  • Vérifier resp.StatusCode : les erreurs HTTP ne sont pas des erreurs Go
  • Réessayer en cas de 429, 503 et de délais d’attente réseau, mais pas en cas d’erreurs client de la série 4xx
  • La temporisation exponentielle et la gigue empêchent l’effet de troupeau
  • Vérifier toujours le contexte avant une nouvelle tentative
Gratuit pour commencer

Apprends Go avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
51
Leçons
203

Questions Fréquemment Posées

La leçon « Gestion des erreurs et logique de nouvelle tentative » est-elle gratuite ?

Oui — le texte complet de « Gestion des erreurs et logique de nouvelle tentative » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Gestion des erreurs et logique de nouvelle tentative » ?

Vérifier les codes d’état et implémenter de nouvelles tentatives Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Go Academy ?

Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Gestion des erreurs et logique de nouvelle tentative » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?

Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Effectuer des requêtes HTTP
  2. Configurer les délais d’expiration et les en-têtes
  3. Décoder les réponses JSON
  4. Gestion des erreurs et logique de nouvelle tentative
← Retour à Go Academy