Node.js hiba a kontextussal

Hogyan adhatunk hibát a dobásokhoz a V8 9.3 és újabb verzióiban

Több összefüggés a hibákhoz

A V8 Javascript motor 9.3 verziójától kezdve a fejlesztőknek lehetőségük lesz új típusú információk hozzáadására alapértelmezett hiba felvetésekor. Egyetlen argumentum megadása helyett hozzáadhat egyfajta hibatípust, más néven hiba okát, hogy az ilyen hibák fogására szolgáló kezelő jobban meg tudja határozni a hiba eredetét.

Pontosabban: a Error-constructor elfogad egy második opcionális paramétert, amely az opciók objektuma, ahol az „oka” tulajdonság használható.

Nézzünk meg egy példát.

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

A hiba okainak előnye

A hiba okainak egyértelmű előnye az, hogy nem kell egyedi Error osztályt definiálnia ahhoz, hogy hasonló eseteket kezeljen a kódban. Másrészt, ha van egy szabványos mechanizmusunk a hiba okaira, az a hibakereső eszközökkel is jól működik.

Kapható V8 9.3 és újabb verzióval

Írása szerint ez a változás még nem elérhető nyilvános használatra, mivel a Node.js jelenlegi legfrissebb 16.4.2-es verziója a V8 legújabb stabil verzióját használja, amely 9.1. Amikor a Node.js elkezdi használni a 9.3 verziót, ennek megfelelően frissítem ezt a cikket.