La sentencia try..catch..finally especifica un bloque de código para probar junto con una respuesta en caso de que ocurra un error. La sentencia try puede contener uno o más bloques try y termina con al menos una cláusula catch o finally.

try...catch:

try {
   throw new Error('mi error');
} catch (err) {
  console.error(err.message);
}

// Output: mi error

try...finally:

try {
   throw new Error('mi error');
} finally {
  console.error('finally');
}

// Output: finally

Cuando no se utiliza una declaración catch, el error no se "detecta", aun cuando se ejecute el bloque finally en el código. En cambio, el error continuará en el bloque superior try (o bloque principal).

try...catch...finally:

try {
   throw new Error('mi error');
} catch (err) {
  console.error(err.message);
} finally {
  console.error('finally');
}

// Output:
// mi error
// finally

Uso típico:

try {
   abrirArchivo(archivo);
   leerArchivo(archivo)
} catch (err) {
  console.error(err.message);
} finally {
  cerrarArchivo(archivo);
}

try...catch anidado:

También puedes:

  • Anidar una declaración try-catch dentro de un bloque try.

Puedes anidar una declaración try..catch dentro de un bloque try. Por ejemplo, para lanzar un error hacia arriba:

try {
  try {
    throw new Error('mi error');
  } catch (err) {
    console.error('interno', err.message);
    throw err;
  } finally {
    console.log('finally interno');
  }
} catch (err) {
  console.error('externo', err.message);
}

// Output: 
// interno mi error  
// finally interno 
// externo mi error

Traducido del artículo - JavaScript Try Catch: Exception Handling Explained