Accueil » Best practices & clean code » Node.js : gérer efficacement les erreurs avec try/catch

Le try/catch est souvent la première barrière contre les erreurs dans une application Node.js. Il permet d’encadrer une portion de code susceptible de générer une exception. Avec l’arrivée d’async/await, il est devenu encore plus pertinent pour gérer les erreurs provenant de promesses.
app.get('/user/:id', async (req, res) => { try { const user = await getUser(req.params.id); res.json(user); } catch (err) { res.status(500).json({ error: 'Impossible de récupérer l’utilisateur' }); } });Cependant, multiplier les try/catch dans chaque route peut rapidement alourdir le code. C’est pourquoi il est essentiel de comprendre quand l’utiliser : idéalement pour des opérations sensibles ou lorsque vous souhaitez renvoyer une réponse spécifique à l’utilisateur.
Pour une gestion plus globale, d’autres patterns comme les middlewares d’erreurs deviennent indispensables.
Dans Express, un middleware d’erreurs est une fonction spéciale qui intercepte automatiquement les erreurs propagées dans l’application. Il s’écrit avec quatre paramètres : (err, req, res, next). Ce pattern permet de centraliser toute la logique de traitement.
app.use((err, req, res, next) => { console.error(err.stack); res.status(err.status || 500).json({ message: err.message || 'Erreur interne du serveur' }); });Grâce à cette approche, vous évitez de répéter des blocs de gestion d’erreurs dans chaque route. Il devient également plus simple d’ajouter des fonctionnalités comme la journalisation, l’envoi d’alertes ou la normalisation des réponses.
Ce middleware agit comme un filet de sécurité global, garantissant que toute erreur non capturée est traitée proprement sans faire tomber le serveur.
Pour une gestion d’erreurs réellement robuste, il est recommandé de combiner try/catch et middleware. Le try/catch permet de gérer les cas particuliers ou de renvoyer des messages personnalisés, tandis que le middleware prend en charge les erreurs non anticipées.
Un pattern courant consiste à créer un helper pour propager automatiquement les erreurs vers le middleware :
const asyncHandler = fn => (req, res, next) => { Promise.resolve(fn(req, res, next)).catch(next); }; app.get('/orders', asyncHandler(async (req, res) => { const orders = await getOrders(); res.json(orders); }));Ce wrapper évite d’écrire des try/catch partout tout en garantissant que la moindre erreur remonte correctement. Résultat : un code plus lisible, plus maintenable et surtout plus fiable.

Au‑delà du code : StackAndLife, ton allié pour progresser et t’équiper.

