Node.js-eraro kun kunteksto

Kiel aldoni eraran kaŭzon al ĵetoj en V8 9.3 kaj pli posta

Pli da kunteksto por eraroj

Komencante kun versio 9.3 de la V8-Javascript-motoro, programistoj havos la eblon aldoni novan tipon de informoj kiam ili ĵetas defaŭltan eraron. Anstataŭ provizi unusolan argumenton, vi povos aldoni specon de erar-speca, ankaŭ nomata erara kaŭzo, tiel ke prizorganto por kapti tiajn erarojn povas pli bone determini de kie la eraro estiĝis.

Por esti pli preciza, la Eraro-konstruanto akceptas duan laŭvolan parametron, kiu estas objekto de ebloj, kie la propraĵo "kaŭzo" povas esti uzata.

Ni rigardu ekzemplon.

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

Avantaĝo de eraraj kaŭzoj

La klara avantaĝo de uzado de eraraj kaŭzoj estas tiu, ke vi ne bezonas difini kutiman Eraran klason por trakti similajn kazojn en via kodo. Aliflanke, havi norman me mechanismanismon por eraraj kaŭzoj ankaŭ bele funkcios per elpurigaj iloj.

Havebla kun V8-versio 9.3 kaj pli posta

Skribante, ĉi tiu ŝanĝo ankoraŭ ne haveblas por publika uzado, ĉar la nuna plej nova versio de Node.js 16.4.2 uzas la plej novan stabilan version de V8, kiu estas 9.1. Kiam Node.js komencos uzi version 9.3, mi ĝisdatigos ĉi tiun artikolon laŭe.