Bağlamla ilgili Node.js hatası

V8 9.3 ve sonraki sürümlerde atmalara neden olan bir hata nasıl eklenir

Hatalar için daha fazla bağlam

V8 Javascript motorunun 9.3 sürümünden başlayarak, geliştiriciler varsayılan bir hata atarken yeni bir bilgi türü ekleme seçeneğine sahip olacaklar. Tek bir argüman sağlamak yerine, hata nedeni olarak da adlandırılan bir tür hata türü ekleyebileceksiniz, böylece bu tür hataları yakalayan bir işleyici, hatanın nereden kaynaklandığını daha iyi belirleyebilir.

Daha kesin olmak gerekirse, Error-constructor, "neden" özelliğinin kullanılabileceği bir seçenekler nesnesi olan ikinci bir isteğe bağlı parametreyi kabul eder.

Bir örneğe bakalım.

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

Hata nedenlerinin avantajı

Hata nedenlerini kullanmanın açık avantajı, kodunuzdaki benzer durumları işlemek için özel bir Hata sınıfı tanımlamanız gerekmemesidir. Öte yandan, hata nedenleri için standart bir mekanizmaya sahip olmak, hata ayıklama araçlarıyla da güzel bir şekilde çalışacaktır.

V8 sürüm 9.3 ve üstü ile kullanılabilir

Şu anki en son Node.js sürüm 16.4.2, V8'in 9.1 olan en son kararlı sürümünü kullandığından, bu değişiklik henüz genel kullanıma açık değildir. Node.js 9.3 sürümünü kullanmaya başladığında, bu makaleyi buna göre güncelleyeceğim.