Maison  >  Article  >  développement back-end  >  Y a-t-il un problème avec le passage d’une seule erreur à error.Join ?

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

WBOY
WBOYavant
2024-02-09 11:03:071056parcourir

将单个错误传递给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
    }
}()

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

defer func() {
    cerr := f.Close()
    err = errors.Join(err, cerr)
}()

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 {
  ...
}
🎜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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer