Maison > Article > développement back-end > Y a-t-il un problème avec le passage d'une seule erreur à error.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.
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 err
和 cerr
均非零,则现在将返回两个错误。如果都是nil
,则返回nil
.
Cependant, si l'un est nil
et l'autre non-nil
, alors nil
而另一个是非 nil
,则 errors.join
不仅会返回非 nil
错误,还会返回一个 errors.joinerror
围绕它的包装器。包装这样的错误会导致任何问题吗?特别是如果调用堆栈中的多个函数使用这种方法,那么单个错误可能会在多层包装器中结束?
如果 errors.joinerror
只有一个非零错误,那仍然是一个连接错误,并且 errors.as
和 errors.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.
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!