Errore Node.js con contesto

Come aggiungere una causa di errore ai lanci in V8 9.3 e versioni successive

Più contesto per gli errori

A partire dalla versione 9.3 del motore Javascript V8, gli sviluppatori avranno la possibilità di aggiungere un nuovo tipo di informazioni quando generano un errore predefinito. Invece di fornire un singolo argomento, sarai in grado di aggiungere un tipo di tipo di errore, chiamato anche causa di errore, in modo che un gestore per rilevare tali errori possa determinare meglio da dove ha avuto origine l'errore.

Per essere più precisi, il costruttore Error accetta un secondo parametro opzionale, che è un oggetto di opzioni, dove può essere utilizzata la proprietà "causa".

Diamo un'occhiata a un esempio.

/**
 * 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;
    }
  }
}

Vantaggio delle cause di errore

Il chiaro vantaggio dell'utilizzo delle cause di errore risiede nel fatto che non è necessario definire una classe di errore personalizzata per gestire casi simili nel codice. D'altra parte, avere un meccanismo standard per le cause di errore funzionerà bene anche con gli strumenti di debug.

Disponibile con V8 versione 9.3 e successive

Al momento della scrittura, questa modifica non è ancora disponibile per l'utilizzo pubblico, poiché l'ultima versione 16.4.2 di Node.js corrente utilizza l'ultima versione stabile di V8, ovvero la 9.1. Quando Node.js inizierà a utilizzare la versione 9.3, aggiornerò questo articolo di conseguenza.