Maison > développement back-end > Golang > le corps du texte

Y a-t-il un problème avec le passage d'une seule erreur à error.Join ?

WBOY
Libérer: 2024-02-09 11:03:07
avant
1090 Les gens l'ont consulté

将单个错误传递给errors.Join 有问题吗?

Lorsque l'éditeur PHP Xinyi résout la gestion des erreurs, il rencontre souvent le problème de transmettre une seule erreur à erreurs.Join. Cette méthode est utilisée pour regrouper plusieurs messages d'erreur en une chaîne afin de faciliter l'enregistrement et la visualisation des journaux d'erreurs. Cependant, nous devons noter que s'il y a trop de messages d'erreur ou s'ils sont trop longs, la chaîne concaténée peut dépasser la limite du système, entraînant la perte d'une partie du message d'erreur. Par conséquent, lors de l’utilisation d’Errors.Join, nous devons examiner attentivement le nombre et la longueur des messages d’erreur pour garantir un enregistrement et un dépannage complets des erreurs.

Contenu des questions

go 1.20 a introduit la fonction errors.join, qui peut envelopper plusieurs erreurs. Y a-t-il des problèmes avec l'appel de cette fonction et le fait de transmettre uniquement une erreur ?

Par exemple, cet article recommande de ne pas utiliser la valeur de retour de defer f.close() 习惯用法,因为这会默默地忽略 close 返回的任何错误。相反,它建议使用命名返回值 err 来允许传播 close pour les fichiers inscriptibles - à moins que cela n'écrase une erreur précédente :

defer func() {
    cerr := f.close()
    if err == nil {
        err = cerr
    }
}()
Copier après la connexion

Il semble plus correct d'utiliser errors.join dans ce cas :

defer func() {
    cerr := f.Close()
    err = errors.Join(err, cerr)
}()
Copier après la connexion

Si errcerr 均非零,则现在将返回两个错误。如果都是nil,则返回nil.

Cependant, si l'un est nil et l'autre non-nil, alors nil 而另一个是非 nil,则 errors.join 不仅会返回非 nil 错误,还会返回一个 errors.joinerror 围绕它的包装器。包装这样的错误会导致任何问题吗?特别是如果调用堆栈中的多个函数使用这种方法,那么单个错误可能会在多层包装器中结束?

解决方法

如果 errors.joinerror 只有一个非零错误,那仍然是一个连接错误,并且 errors.aserrors.is non seulement une erreur non nil sera renvoyée, mais un error.joinerror Un wrapper autour de lui. Des erreurs d’emballage comme celle-ci causeront-elles des problèmes ? Surtout si plusieurs fonctions de la pile d'appels utilisent cette approche, une seule erreur peut se retrouver dans plusieurs couches de wrappers ?

Solution de contournement

Si errors.joinerror n'a qu'une seule erreur non nulle, il s'agit toujours d'une erreur de jointure, et les fonctions errors.as et errors.is fonctionnent comme prévu. Cela est vrai quel que soit le niveau d’imbrication de l’erreur de connexion.

🎜Le seul problème potentiel est si vous avez un code comme celui-ci : 🎜
err:=someFunc()
if err==io.EOF {
  ...
}
Copier après la connexion
🎜Alors cela échouera. Ce code doit être réécrit pour être utilisé 🎜. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!