Chapitre 1 · Leçon 3
Remplacer les exceptions implicites par des erreurs typées
Les exceptions throw rendent le flux d'erreurs invisible dans la signature des fonctions. Le Result<T, E> monad rend les erreurs explicites et force le caller à les gérer.
GetTutorialBySlug.usecase.ts
1async execute(slug: string): Promise<Result<Tutorial, NotFoundError>> {
2 const tutorial = await this.repo.findBySlug(slug);
3
4 if (!tutorial) {
5 return Result.fail(new NotFoundError('Tutorial', slug));
6 }
7
8 return Result.ok(tutorial);
9}
10
11// Dans le controller — le compilateur force la vérification
12const result = await useCase.execute(slug);
13if (result.isFail) return next(result.getError()); // 404 typé
14res.json(result.getValue()); // Tutorial garanti iciLes erreurs inattendues (crash DB, bug de programmation) doivent remonter comme exceptions normales. Result est pour les erreurs métier prévues : not found, validation, conflit.