Quel est le plus grand défi du débogage ? L’un d’eux consiste sans aucun doute à rechercher la source des erreurs.
Imaginez ce scénario :
const func = () => { doSth('A'); doSth('B'); };
Lorsque func renvoie une erreur, comment identifier à quelle étape l'erreur s'est produite ? Était-ce causé par doSth('A'), doSth('B') ou func lui-même ? De toute évidence, l'erreur manque de contexte suffisant.
Une approche courante pour résoudre ce problème pourrait ressembler à ceci :
const func = () => { try { doSth('A'); } catch (error) { throw new Error('An error from A', error); } try { doSth('B'); } catch (error) { throw new Error('An error from B', error); } };
Avec cette approche, vous pouvez localiser plus facilement la source de l'erreur. Cette solution présente cependant plusieurs limites :
Perte des détails de l'erreur :
Si l'erreur contient des informations détaillées (par exemple, charges utiles, codes d'état HTTP, codes d'erreur), cette approche ajoute uniquement le message d'erreur de doSth à l'erreur nouvellement construite. D'autres détails cruciaux, y compris la trace originale de la pile, sont perdus.
Diminution de la lisibilité du journal :
Avec plus de deux points d'erreur potentiels, les journaux peuvent devenir encombrés et difficiles à interpréter.
Ambiguïté dans l'expression de l'intention :
Le code ne communique pas explicitement que la nouvelle erreur est causée par l'interception de la fonction doSth spécifique, ce qui laisse place à une meilleure lisibilité du code.
Pour résoudre ces problèmes, ECMAScript 2022 a introduit error.cause.
Cette fonctionnalité permet aux développeurs de spécifier la cause première d'une erreur lors de la création d'un nouvel objet d'erreur. En utilisant error.cause, vous pouvez établir une chaîne d'erreurs, ce qui facilite le débogage et la recherche de la cause première d'un problème.
Voici un exemple simple :
try { // Some operation that may throw an error } catch (error) { throw new Error('Something went wrong', { cause: error }); }
Avec cette approche, vous pouvez établir des liens de causalité entre les erreurs. Par exemple :
const func = () => { try { doSth('A'); } catch (error) { throw new Error('An error from A', { cause: error }); } try { doSth('B'); } catch (error) { throw new Error('An error from B', { cause: error }); } };
Cela nous permet de détecter les erreurs générées par les fonctions de niveau inférieur (par exemple, doSth('A')), de générer une nouvelle erreur qui ajoute un contexte pertinent (par exemple, "Une erreur s'est produite lors de l'exécution de doSth('A')" ) et conservez les détails de l'erreur d'origine (par exemple, "A est un argument illégal.").
Un autre avantage de error.cause est sa capacité à créer une chaîne d'erreurs liées, permettant aux développeurs de retracer les problèmes à travers plusieurs couches de l'application :
const func = () => { try { try { try { doSth('A'); } catch (error) { throw new Error('Error at depth 3', { cause: error }); } } catch (error) { throw new Error('Error at depth 2', { cause: error }); } } catch (error) { throw new Error('Error at depth 1', { cause: error }); } }; console.log(error.cause.cause); // Error at depth 3
Dans Node.js, les erreurs avec une cause sont gérées spécialement dans la console. Toutes les piles d'erreurs associées sont imprimées :
const func = () => { doSth('A'); doSth('B'); };
const func = () => { try { doSth('A'); } catch (error) { throw new Error('An error from A', error); } try { doSth('B'); } catch (error) { throw new Error('An error from B', error); } };
Cette approche améliore non seulement la traçabilité des erreurs, mais améliore également la lisibilité et la maintenabilité de votre code.
Leapcell est la plate-forme sans serveur de nouvelle génération pour l'hébergement Web, les tâches asynchrones et Redis :
Support multilingue
Déployez un nombre illimité de projets gratuitement
Une rentabilité imbattable
Expérience de développeur simplifiée
Évolutivité sans effort et hautes performances
Explorez-en davantage dans la documentation !
Suivez-nous sur X : @LeapcellHQ
À lire sur notre blog
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!