Error de Node.js con contexto

Cómo agregar una causa de error a los lanzamientos en V8 9.3 y posterior

Más contexto para los errores

A partir de la versión 9.3 del motor Javascript V8, los desarrolladores tendrán la opción de agregar un nuevo tipo de información cuando arrojen un error predeterminado. En lugar de proporcionar un solo argumento, podrá agregar un tipo de tipo de error, también llamado causa de error, de modo que un controlador para detectar tales errores pueda determinar mejor de dónde se originó el error.

Para ser más precisos, el constructor Error acepta un segundo parámetro opcional, que es un objeto de opciones, donde se puede usar la propiedad “causa”.

Veamos un ejemplo.

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

Ventaja de las causas de error

El beneficio claro de usar causas de error es que no es necesario definir una clase de error personalizada para manejar casos similares en su código. Por otro lado, tener un mecanismo estándar para las causas de error también funcionará muy bien con las herramientas de depuración.

Disponible con V8 versión 9.3 y posteriores

En el momento de escribir este artículo, este cambio aún no está disponible para uso público, ya que la última versión actual de Node.js 16.4.2 usa la última versión estable de V8, que es 9.1. Cuando Node.js comience a usar la versión 9.3, actualizaré este artículo en consecuencia.