Je trouve la gestion d'erreur de Go atroce, pour ne pas dire inexistante.
Le langage ne te force pas à la traiter, rien ne t'empêche d'écrire :
res,_:=foo()
Il peut quand même y avoir des données dans le résultat, même si err est nil :
funcfoo()(int,error){return42,errors.New("oops")}
Dans ce cas, on fait quoi de res ?
Il faut utiliser des modules tiers pour garder les informations qu'une stacktrace d'exception a par défaut, car :
res,err:=foo()iferr!=nil{returnwhatever,err}
Ici on pert complètement l'information, la bonne pratique c'est d'encapsuler l'erreur dans une nouvelle, en utilisant par exemple le module xerrors.
Le type error est concrètement juste une chaîne de caractères, sans module tiers tel que xerrors ou autre, impossible de déterminer le type de l'erreur, alors qu'avec une exception, on peut au moins faire du pattern matching sur son type.
Au final, je préfère un type monadique, comme std::expected<T, E> en C++ ou Result<T, E> en Rust.
Ici:
on a bien une valeur OU une erreur
on est obligé de traiter l'erreur
on peut faire du pattern matching sur le type de l'erreur et sa valeur
on sait quel type d'erreur une fonction peut retourner
Les exceptions pourraient être du sucre syntaxique pour un tel type monadique. D'ailleurs, l'opérateur ? en Rust ressemble beaucoup à ça :
fnfoo()-> Result<T,E1>{// ...}fnbar()-> Result<T,E2>{letval=foo()?;// si foo retourne Result::Err(E1),// alors bar retourne Result::Err(E2) a condition que E2 implémente From<E1>// si l'implémentation n'est pas trouvée --> erreur de compilation}
C'est tout de suite plus propre.
TL;DR: Les gens qui vantent les mérites de la gestion d'erreur en Go, je les comprends pas :(
[^] # Re: Une gestion d’erreur moderne ?
Posté par David Delassus (site web personnel) . En réponse à la dépêche À la découverte du langage V. Évalué à 8. Dernière modification le 06 septembre 2023 à 14:32.
Je trouve la gestion d'erreur de Go atroce, pour ne pas dire inexistante.
Le langage ne te force pas à la traiter, rien ne t'empêche d'écrire :
Il peut quand même y avoir des données dans le résultat, même si
errestnil:Dans ce cas, on fait quoi de
res?Il faut utiliser des modules tiers pour garder les informations qu'une stacktrace d'exception a par défaut, car :
Ici on pert complètement l'information, la bonne pratique c'est d'encapsuler l'erreur dans une nouvelle, en utilisant par exemple le module
xerrors.Le type
errorest concrètement juste une chaîne de caractères, sans module tiers tel quexerrorsou autre, impossible de déterminer le type de l'erreur, alors qu'avec une exception, on peut au moins faire du pattern matching sur son type.Au final, je préfère un type monadique, comme
std::expected<T, E>en C++ ouResult<T, E>en Rust.Ici:
Les exceptions pourraient être du sucre syntaxique pour un tel type monadique. D'ailleurs, l'opérateur
?en Rust ressemble beaucoup à ça :C'est tout de suite plus propre.
TL;DR: Les gens qui vantent les mérites de la gestion d'erreur en Go, je les comprends pas :(
https://link-society.com - https://kubirds.com - https://github.com/link-society/flowg