Stratégies de gestion des erreurs
Gestion complète des erreurs de délai d'attente (timeout)
1. Modèle de base de gestion des erreurs
func robustTimeoutHandler() error {
ch := make(chan int, 1)
select {
case result := <-ch:
return processResult(result)
case <-time.After(3 * time.Second):
return fmt.Errorf("operation timed out after 3 seconds")
}
}
Flux de gestion des erreurs
flowchart TD
A[Start Operation] --> B{Timeout Occurred?}
B -->|Yes| C[Generate Error]
B -->|No| D[Process Result]
C --> E[Log Error]
C --> F[Retry/Fallback]
D --> G[Complete Operation]
Types d'erreurs et stratégies de gestion
Type d'erreur |
Stratégie de gestion |
Exemple |
Erreur de délai d'attente (Timeout Error) |
Nouvelle tentative/Réponse de secours (Retry/Fallback) |
Reconnexion au service |
Erreur réseau (Network Error) |
Retard exponentiel (Exponential Backoff) |
Délai croissant |
Épuisement de ressources (Resource Exhaustion) |
Disjoncteur de circuit (Circuit Breaker) |
Suspension temporaire du service |
2. Gestion avancée des erreurs avec le contexte (Context)
func sophisticatedErrorHandling() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
errChan := make(chan error, 1)
go func() {
err := performCriticalOperation(ctx)
if err!= nil {
errChan <- err
}
}()
select {
case err := <-errChan:
handleSpecificError(err)
case <-ctx.Done():
switch ctx.Err() {
case context.DeadlineExceeded:
log.Println("Operation timed out")
case context.Canceled:
log.Println("Operation was canceled")
}
}
}
Enveloppe d'erreur personnalisée
type TimeoutError struct {
Operation string
Duration time.Duration
Err error
}
func (e *TimeoutError) Error() string {
return fmt.Sprintf("operation %s timed out after %v: %v",
e.Operation, e.Duration, e.Err)
}
Mécanisme de nouvelle tentative avec gestion avancée des erreurs
func retryWithErrorHandling(maxRetries int) error {
for attempt := 1; attempt <= maxRetries; attempt++ {
err := executeOperationWithTimeout()
if err == nil {
return nil
}
if isRecoverableError(err) {
backoffDuration := calculateBackoff(attempt)
time.Sleep(backoffDuration)
continue
}
return &TimeoutError{
Operation: "critical-operation",
Duration: 5 * time.Second,
Err: err,
}
}
return errors.New("max retries exceeded")
}
Bonnes pratiques
- Créez des types d'erreurs personnalisés
- Implémentez une journalisation détaillée
- Utilisez le contexte pour la gestion des délais d'attente
- Fournissez des messages d'erreur significatifs
- Pensez aux capacités de suivi des erreurs de LabEx
Principes de gestion des erreurs
- Gérez toujours les scénarios potentiels de délai d'attente
- Implémentez une dégradation gracieuse
- Fournissez des informations claires sur les erreurs
- Utilisez une gestion structurée des erreurs
- Minimisez le surcoût de performance
- Objets d'erreur légers
- Vérification efficace des erreurs
- Surcoût d'allocation minimal
- Mécanismes de propagation rapide des erreurs