Erreur Node.js avec le contexte

Comment ajouter une cause d'erreur aux lancers dans V8 9.3 et versions ultérieures

Plus de contexte pour les erreurs

À partir de la version 9.3 du moteur Javascript V8, les développeurs auront la possibilité d'ajouter un nouveau type d'informations lors de la génération d'une erreur par défaut. Au lieu de fournir un seul argument, vous pourrez ajouter une sorte de type d'erreur, également appelé cause d'erreur, afin qu'un gestionnaire permettant de détecter de telles erreurs puisse mieux déterminer d'où provient l'erreur.

Pour être plus précis, le constructeur Error accepte un deuxième paramètre facultatif, qui est un objet d'options, où la propriété « cause » peut être utilisée.

Regardons un exemple.

/**
 * A simple demonstration how
 * the syntax will benefit from
 * the error-cause option in
 * new Errors.
 * 
 * Note that the example is greatly
 * simplified to focus on the 
 * relevant changes.
 */
async function processImage(props) {
  try {
    await minifyImage(props);
  } catch (err) {
    throw new Error('image-minification', { cause: err });
  }
  try {
    await uploadImage(props);
  } catch (err) {
    throw new Error('image-upload', { cause: err });
  }
  try {
    await cleanUpCache(props);
    await notifyUser(props);
  } catch (err) {
    throw new Error('post-processing', { cause: err });
  }
}

//
// ... later in our code ...
//

async function selectAndUploadImage(props){
  try {
    await processImage(props);
  } catch (err) {
    console.error(err.cause);
    
    switch(err) {
      case 'image-minification':
        // handle the minification error,
        // which is available by accessing
        // 'err.cause'.
        break;
      case 'image-upload':
        // ...
        break;
      case 'post-processing':
        // ...
        break;
    }
  }
}

Avantage des causes d'erreur

L'avantage évident de l'utilisation des causes d'erreur réside dans le fait que vous n'avez pas à définir une classe d'erreur personnalisée pour gérer des cas similaires dans votre code. D'un autre côté, avoir un mécanisme standard pour les causes d'erreur fonctionnera également bien avec les outils de débogage.

Disponible avec V8 version 9.3 et ultérieure

Au moment de la rédaction, ce changement n'est pas encore disponible pour un usage public, car la dernière version actuelle de Node.js 16.4.2 utilise la dernière version stable de V8, qui est la 9.1. Lorsque Node.js commencera à utiliser la version 9.3, je mettrai à jour cet article en conséquence.