La gestion des erreurs dans les opérations asynchrones est cruciale pour le développement d'applications robustes en Node.js. Voici comment vous pouvez gérer les erreurs dans différents contextes asynchrones :

Callbacks

Dans le modèle de callback traditionnel, les erreurs sont généralement passées comme premier argument à la fonction de callback (suivant la convention d'erreur d'abord, ou "error-first callbacks").

fs.readFile('/some/file/that/does-not-exist', 'utf8', (err, data) => {
  if (err) {
    // Gérer l'erreur ici
    console.error('Une erreur est survenue lors de la lecture du fichier!', err);
    return;
  }
  // Utiliser 'data' si aucune erreur n'est survenue
});

 

Promesses

Avec les promesses, vous utilisez la méthode .catch() pour gérer les erreurs. Toute erreur survenue dans la chaîne de promesses sera propagée vers le bas jusqu'au prochain gestionnaire .catch() disponible.

doSomethingAsync()
  .then(doSomethingElseAsync)
  .then(doYetAnotherThingAsync)
  .catch(error => {
    // Toutes les erreurs dans la chaîne ci-dessus seront capturées ici
    console.error('Une erreur est survenue dans la chaîne de promesses', error);
  });

 

Async/Await

Lorsque vous utilisez async/await, vous pouvez capturer les erreurs avec des blocs try...catch, ce qui rend la gestion des erreurs asynchrones aussi simple que la gestion des erreurs synchrones.

async function myAsyncFunction() {
  try {
    const data = await doSomethingAsync();
    const moreData = await doSomethingElseAsync(data);
    // ...
  } catch (error) {
    // Gérer l'erreur ici
    console.error('Une erreur est survenue', error);
  }
}

 

Gestion des Rejets Non Gérés

Node.js fournit également des mécanismes pour attraper les erreurs globales qui ne sont pas capturées par les méthodes ci-dessus :

  • process.on('unhandledRejection', handler) : pour écouter les promesses rejetées qui n'ont pas de gestionnaire d'erreur.
  • process.on('uncaughtException', handler) : pour écouter les exceptions non capturées qui se propagent jusqu'à la boucle d'événements.
javascript
process.on('unhandledRejection', (reason, promise) => { console.error('Promesse rejetée non gérée:', promise, 'raison:', reason); // Logique de nettoyage ou de sortie du processus }); process.on('uncaughtException', (error) => { console.error('Exception non capturée:', error); // Logique de nettoyage ou de sortie du processus });

Note Importante : Il est généralement recommandé de terminer le processus après une uncaughtException, car l'état de l'application peut devenir indéfini. Pour les unhandledRejection, il est préférable de toujours avoir un gestionnaire .catch() pour chaque promesse, ou d'utiliser un bloc try...catch avec async/await.

Bonnes Pratiques

  • Utilisez des blocs try...catch avec async/await pour une syntaxe claire et une gestion des erreurs similaire à celle du code synchrone.
  • Assurez-vous que chaque promesse a un gestionnaire .catch() pour éviter les rejets non gérés.
  • Considérez l'utilisation de bibliothèques comme bluebird pour des fonctionnalités avancées de gestion des promesses et des erreurs.
  • Utilisez des outils de surveillance et de logging pour enregistrer les erreurs asynchrones dans vos systèmes de production.
  • Soyez prudent avec l'utilisation de process.on('unhandledRejection') et process.on('uncaughtException'). Utilisez-les pour logger des erreurs et nettoyer les ressources, mais pas comme une méthode de gestion des erreurs asynchrones.
Modifié le: jeudi 2 novembre 2023, 08:31