Node.js offre des mécanismes pour attraper des erreurs globales qui ne sont pas capturées par des blocs try...catch. Ces mécanismes sont principalement utilisés pour attraper des exceptions non gérées (uncaughtException) et des rejets de promesses non gérés (unhandledRejection).

uncaughtException

L'événement uncaughtException est émis lorsqu'une exception n'est capturée par aucun bloc try...catch et atteint la boucle d'événements. Écouter cet événement vous permet de réaliser des actions avant que Node.js ne s'arrête, comme logger l'erreur et nettoyer les ressources.

Voici un exemple de gestion de uncaughtException :

process.on('uncaughtException', (error) => {
  console.error('Erreur non capturée:', error);
  // Effectuer un nettoyage si nécessaire
  // Il est recommandé de redémarrer le processus après une exception non capturée
  process.exit(1); // Sortie avec un code d'erreur
});

 

Attention : Après une uncaughtException, l'état de l'application Node.js peut être incertain. Il n'est pas recommandé de continuer à exécuter le processus après une telle erreur. La pratique la plus courante est de logger l'erreur, de nettoyer les ressources si nécessaire et de redémarrer le processus.

unhandledRejection

L'événement unhandledRejection est émis lorsqu'une promesse est rejetée et qu'aucun gestionnaire de rejet n'est attaché à la promesse dans le cycle d'événements suivant. Cela peut être utilisé pour attraper et gérer des erreurs dans des promesses qui ont été omises par inadvertance.

Voici un exemple de gestion de unhandledRejection :

process.on('unhandledRejection', (reason, promise) => {
  console.error('Rejet de promesse non géré:', promise, 'raison:', reason);
  // Logique de gestion, comme logger l'erreur et/ou terminer le processus
});

 

Bonnes pratiques :

  • Utilisez uncaughtException et unhandledRejection principalement pour logger les erreurs et nettoyer les ressources avant de terminer le processus.
  • Ne vous fiez pas à ces événements pour gérer les erreurs de manière logique dans votre application. Utilisez plutôt des blocs try...catch et des chaînes de promesses avec .catch() pour gérer les erreurs de manière prévisible.
  • Considérez l'utilisation d'outils de surveillance et de redémarrage de processus comme PM2, Forever ou le module intégré cluster pour redémarrer automatiquement les processus Node.js après un échec.

En résumé, bien que uncaughtException et unhandledRejection puissent être utiles pour attraper et logger des erreurs inattendues, ils ne doivent pas remplacer une gestion d'erreur appropriée et structurée dans votre application.

Modifié le: jeudi 2 novembre 2023, 07:43