Gestion des erreurs en TypeScript : techniques avancées try/catch

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Gestion des erreurs en TypeScript : du try/catch de base aux modèles industriels

\n\n

La gestion des erreurs ne se limite pas aux blocs try/catch. En TypeScript, grâce à un système de types strict, nous pouvons porter la gestion des erreurs à un tout autre niveau. Dans cet article, nous allons explorer des techniques avancées qui vous aideront à écrire un code plus fiable et prévisible.

\n\n

Le problème du try/catch standard en TypeScript

\n\n

Le bloc try/catch classique en TypeScript a un problème fondamental : le type de l'erreur interceptée est unknown (ou any dans les anciennes versions). Cela signifie que TypeScript ne sait pas avec quel objet nous avons affaire.

\n\n
try {\n  // du code dangereux\n  const result = JSON.parse('{"data": 123}');\n} catch (error) {\n  // error est de type unknown\n  // On ne peut pas simplement appeler error.message\n  console.log(error.message); // Erreur de compilation !\n}
\n\n

Cela oblige les développeurs soit à ignorer les types, soit à écrire des vérifications lourdes. Voyons comment résoudre ce problème à un niveau avancé.

\n\n

1. Création d'un système d'erreurs personnalisées avec typage

\n\n

Au lieu de lancer des Error ordinaires, créez une hiérarchie d'erreurs personnalisées. Cela permettra à TypeScript de distinguer les types d'erreurs au moment de la compilation.

\n\n
// Classe de base pour toutes les erreurs de l'application\nclass AppError extends Error {\n  constructor(\n    message: string,\n    public readonly code: string,\n    public readonly statusCode: number = 500\n  ) {\n    super(message);\n    this.name = this.constructor.name;\n  }\n}\n\n// Types d'erreurs spécifiques\nclass ValidationError extends AppError {\n  constructor(message: string) {\n    super(message, 'VALIDATION_ERROR', 400);\n  }\n}\n\nclass NotFoundError extends AppError {\n  constructor(resource: string) {\n    super(`${resource} introuvable`, 'NOT_FOUND', 404);\n  }\n}\n\nclass DatabaseError extends AppError {\n  constructor(message: string) {\n    super(message, 'DB_ERROR', 500);\n  }\n}\n\n// Utilisation\nfunction findUser(id: string): User {\n  if (!id) throw new ValidationError('ID obligatoire');\n  // ... logique de recherche\n  if (!user) throw new NotFoundError('Utilisateur');\n  return user;\n}
\n\n

2. Type guards pour la gestion des erreurs

\n\n

Pour traiter en toute sécurité différents types d'erreurs, utilisez des type guards. C'est un modèle clé pour travailler avec unknown dans catch.

\n\n
// Type guard pour AppError\nfunction isAppError(error: unknown): error is AppError {\n  return error instanceof AppError;\n}\n\n// Type guard pour ValidationError\nfunction isValidationError(error: unknown): error is ValidationError {\n  return error instanceof ValidationError;\n}\n\n// Gestion avancée\ntry {\n  const user = findUser(userId);\n} catch (error) {\n  if (isValidationError(error)) {\n    // TypeScript sait que error est ValidationError\n    console.error(`Erreur de validation : ${error.message}`);\n    return { status: 400, message: error.message };\n  }\n  \n  if (isAppError(error)) {\n    // error est AppError\n    console.error(`Code d'erreur : ${error.code}`);\n    return { status: error.statusCode, message: error.message };\n  }\n  \n  // Erreur inconnue\n  if (error instanceof Error) {\n    console.error('Erreur inconnue :', error.message);\n  }\n  \n  return { status: 500, message: 'Erreur interne du serveur' };\n}
\n\n

3. Modèle Result (Either monad)

\n\n

Il s'agit d'une alternative aux exceptions qui rend la gestion des erreurs explicite au niveau des types. Au lieu de lancer une erreur, la fonction retourne un objet qui peut contenir soit un résultat réussi, soit une erreur.

\n\n
// Définition des types pour le modèle Result\ntype Success<T> = { success: true; data: T };\ntype Failure<E> = { success: false; error: E };\ntype Result<T, E> = Success<T> | Failure<E>;\n\n// Fonctions utilitaires\nfunction success<T>(data:                

Blogs

Book Recommendations