Maison > interface Web > js tutoriel > Adieu les exceptions ! Maîtriser la gestion des erreurs en JavaScript avec le modèle de résultat

Adieu les exceptions ! Maîtriser la gestion des erreurs en JavaScript avec le modèle de résultat

DDD
Libérer: 2024-11-28 22:46:12
original
507 Les gens l'ont consulté

Goodbye Exceptions! Mastering Error Handling in JavaScript with the Result Pattern

Le Result Pattern est une approche de programmation fonctionnelle utilisée dans de nombreux langages de programmation comme Rust, Go, C# (et d'autres langages) pour gérer les erreurs sans s'appuyer sur des blocs try-catch. Il s’agit de représenter le résultat d’une opération comme un objet indiquant explicitement le succès ou l’échec. Ce modèle est particulièrement utile en programmation asynchrone.

Quel est le modèle de résultat ?

Le modèle de résultat représente le résultat d'une opération utilisant deux états explicites :

  • Succès (Ok) : Contient la valeur de réussite.
  • Échec (Err) : contient la raison de l'erreur ou de l'échec

Comment implémenter le modèle de résultat

créons un objet utilitaire de résultats

const Result = {
  Ok: (value) => ({ isOk: true, value }),
  Err: (error) => ({ isOk: false, error }),
};
Copier après la connexion
Copier après la connexion

utilisons ce modèle de résultat dans une fonction asynchrone

const fetchData = async (url) => {
  try {
    const response = await fetch(url);
    if (!response.ok) {
      return Result.Err(`HTTP error: ${response.status}`);
    }
    const data = await response.json();
    return Result.Ok(data);
  } catch (err) {
    return Result.Err(err.message);
  }
};

const main = async () => {
  const result = await fetchData("https://jsonplaceholder.typicode.com/posts");
  if (result.isOk) {
    console.log("Success:", result.value);
  } else {
    console.error("Error:", result.error);
  }
};

main();
Copier après la connexion
Copier après la connexion

Avantages du modèle de résultat

1. Lisibilité améliorée : évite les blocs try-catch imbriqués
Problème avec try-catch :
L'utilisation de try-catch pour la gestion des erreurs peut conduire à un code profondément imbriqué lors de la gestion de plusieurs opérations. Cela rend le code plus difficile à lire et à maintenir.

Les principaux avantages du modèle de résultat sont qu'il encapsule les erreurs dans la valeur de retour, éliminant ainsi le besoin de blocs try-catch imbriqués. La logique de gestion des erreurs devient plus propre et plus structurée.

Voyons un exemple d'exception try-catch imbriquée

const process = async (data) =>{
    // YOUR LOGIC TO PROCESS THE DATA
    return result
}

const processData = async () => {
    try {
      const response = await fetch("https://jsonplaceholder.typicode.com/posts");
      const data = await response.json();
      try {
        const processedData = process(data);
        return processedData;
      } catch (processError) {
        console.error("Error processing data:", processError);
      }
    } catch (fetchError) {
      console.error("Error fetching data:", fetchError);
    }
};
Copier après la connexion

Implémentons maintenant la même logique de récupération de données en utilisant le modèle de résultat

const process = async (data) =>{
    // YOUR LOGIC TO PROCESS THE DATA
    return result
}

const processData = async () => {
  const fetchResult = await fetchData("https://jsonplaceholder.typicode.com/posts");
  if (!fetchResult.isOk) return fetchResult;

  const processResult = process(fetchResult.value);
  return processResult;
};
Copier après la connexion

2. Explicitité : communique clairement la possibilité d'un échec
Problème avec la gestion implicite des erreurs :
Les fonctions JavaScript peuvent générer des erreurs implicitement, ce qui rend difficile de savoir si une fonction peut échouer à moins d'être explicitement documentée. Cela peut entraîner des erreurs d'exécution inattendues.

Comment le modèle de résultat aide :
Le modèle de résultat renvoie explicitement Ok ou Err, signalant si une opération a réussi ou échoué. Cela rend le comportement de la fonction prévisible et plus facile à raisonner.

Exemple de gestion implicite des erreurs

const processUserInput = (input) => {
  if (!input || input.trim() === "") {
    throw new Error("Input cannot be empty");
  }
  return `Processed: ${input}`;
};
Copier après la connexion

Exemple de gestion explicite des erreurs avec le modèle de résultat

const processUserInput = (input) => {
  if (!input || input.trim() === "") {
    return Result.Err("Input cannot be empty");
  }
  return Result.Ok(`Processed: ${input}`);
};

const userInput = "  ";
const result = processUserInput(userInput);

if (result.isOk) {
  console.log("Success:", result.value);
} else {
  console.error("Failure:", result.error);
}
Copier après la connexion

3. Composabilité : plus facile à enchaîner les opérations
Problème avec try-catch :
Lors de l’enchaînement de plusieurs opérations, une exception peut perturber l’ensemble du flux. La gestion de ces exceptions avec try-catch ajoute un passe-partout important.

Comment le modèle de résultat aide :
Le modèle de résultat simplifie la composition en transmettant les valeurs Ok et en arrêtant l'exécution au premier Err. Cela garantit un flux d’opérations propre et prévisible.

Exemple de modèle sans résultat

const Result = {
  Ok: (value) => ({ isOk: true, value }),
  Err: (error) => ({ isOk: false, error }),
};
Copier après la connexion
Copier après la connexion

Exemple avec modèle de résultat

const fetchData = async (url) => {
  try {
    const response = await fetch(url);
    if (!response.ok) {
      return Result.Err(`HTTP error: ${response.status}`);
    }
    const data = await response.json();
    return Result.Ok(data);
  } catch (err) {
    return Result.Err(err.message);
  }
};

const main = async () => {
  const result = await fetchData("https://jsonplaceholder.typicode.com/posts");
  if (result.isOk) {
    console.log("Success:", result.value);
  } else {
    console.error("Error:", result.error);
  }
};

main();
Copier après la connexion
Copier après la connexion

Conclusion

Le Result Pattern offre une alternative puissante et élégante au try-catch pour la gestion des erreurs en JavaScript. En offrant une lisibilité améliorée, une gestion explicite des erreurs et une composabilité, il améliore la robustesse et la prévisibilité des flux de travail asynchrones.

Si vous travaillez avec une logique complexe ou plusieurs opérations asynchrones, envisagez d'utiliser le modèle de résultat pour rendre votre code plus propre et plus maintenable.

N'hésitez pas à donner votre avis sur ce patron, désolé pour les fautes de frappe.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal