multierr pour Go : combiner et gérer plusieurs erreurs
En Go, la gestion des erreurs est une partie explicite et essentielle du développement. Cependant, il arrive souvent qu'une seule opération puisse générer plusieurs erreurs. Par exemple, lors du traitement par lots de fichiers, de la validation d'une structure de données complexe ou de l'exécution de tâches parallèles. Le package standard errors ne permet de travailler qu'avec une seule erreur à la fois, ce qui complique la collecte et l'analyse de tous les échecs survenus.
La bibliothèque multierr d'Uber (oui, la même entreprise qui a créé zap et fx) résout ce problème de manière élégante et efficace. Elle fournit une API simple pour combiner plusieurs erreurs indépendantes en une seule erreur composite. Cela permet de conserver le contexte de tous les échecs sans perdre d'informations et de les traiter en un seul endroit. Contrairement à la création manuelle de slices d'erreurs, multierr propose des fonctions pratiques pour combiner, vérifier la présence d'erreurs et itérer sur celles-ci.
La philosophie principale de la bibliothèque est la simplicité et la performance. Elle n'effectue pas d'allocations inutiles sur le tas si ce n'est pas nécessaire et s'efforce de minimiser les frais généraux. multierr est idéal lorsque vous devez collecter des erreurs provenant de différentes sources (par exemple, des goroutines) et les retourner comme un résultat unique, qui peut être vérifié avec le standard if err != nil.
Installation
L'installation de la bibliothèque se fait avec la commande standard go get. Assurez-vous d'avoir Go version 1.13 ou supérieure (pour le support de errors.Is et errors.As).
go get go.uber.org/multierr
Après avoir exécuté la commande, la bibliothèque sera ajoutée à votre fichier go.mod. Elle s'importe comme suit :
import "go.uber.org/multierr"
Démarrage rapide : exemple minimal
Prenons le cas le plus simple : nous avons deux fonctions qui peuvent retourner une erreur. Nous voulons exécuter les deux et, si au moins une échoue, retourner une erreur globale.
package main
import (
"errors"
"fmt"
"go.uber.org/multierr"
)
func doSomething() error {
return errors.New("première erreur")
}
func doAnotherThing() error {
return errors.New("deuxième erreur")
}
func main() {
var err error
// Exécution de la première opération
err = multierr.Append(err, doSomething())
// Exécution de la deuxième opération
err = multierr.Append(err, doAnotherThing())
if err != nil {
fmt.Println("Des erreurs sont survenues :")
// Affichage de toutes les erreurs, séparées par un saut de ligne
for _, e := range multierr.Errors(err) {
fmt.Println("-", e)
}
}
}
Dans cet exemple, multierr.Append ajoute une nouvelle erreur à une erreur existante. Si err est nil, la fonction retourne simplement la nouvelle erreur. En résultat, nous obtenons une seule erreur composite qui peut être décomposée avec multierr.Errors.
Fonctions et méthodes principales
La bibliothèque multierr fournit un ensemble de fonctions petit mais très puissant. Examinons chacune d'elles en détail.
1. multierr.Append
Signature : func Append(left error, right error) error
Description : C'est la fonction principale pour combiner deux erreurs. Si les deux erreurs sont nil, elle retourne nil. Si l'une d'elles est nil, elle retourne l'autre. Si les deux ne sont pas nil, elles sont combinées en une seule erreur composite.
err1 := errors.New("erreur 1")
err2 := e
Aussi dans la bibliothèque
Travailler avec YAML en C# (.NET) : bibliothèques et exemples d'utilisation
Travailler avec Excel en C# (.NET) : Bibliothèques EPPlus et ClosedXML