Node.js-fout met konteks

Hoe om 'n foutoorsaak by te gooi in V8 9.3 en later

Meer konteks vir foute

Vanaf weergawe 9.3 van die V8 Javascript-enjin, sal ontwikkelaars die opsie hê om 'n nuwe soort inligting by te voeg wanneer hulle 'n standaardfout gooi. In plaas daarvan om 'n enkele argument te verskaf, kan u 'n soort fouttipe, ook genoem foutoorsak, byvoeg, sodat 'n hanteerder om sulke foute op te vang, beter kan bepaal waar die fout ontstaan het.

Om meer presies te wees, aanvaar die Foutkonstrukteur 'n tweede opsionele parameter, wat 'n voorwerp van opsies is, waar die eiendom "oorsaak" gebruik kan word.

Kom ons kyk na 'n voorbeeld.

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

Voordeel van foutoorsake

Die duidelike voordeel van die gebruik van foutoorsake is dat u nie 'n aangepaste foutklas hoef te definieer om soortgelyke gevalle in u kode te hanteer nie. Aan die ander kant sal 'n standaardmeganisme vir foutoorsake ook goed werk met foutopsporingsinstrumente.

Beskikbaar met V8 weergawe 9.3 en later

Met die skryf hiervan is hierdie verandering nog nie beskikbaar vir openbare gebruik nie, aangesien die huidige jongste Node.js-weergawe 16.4.2 die nuutste stabiele weergawe van V8, wat 9.1 is, gebruik. Wanneer Node.js weergawe 9.3 gaan begin gebruik, sal ek hierdie artikel dienooreenkomstig opdateer.