Exceptions dans les callbacks asynchrones en JavaScript

Supposons que si un numéro d'élément de tableau inexistant soit passé en paramètre à make - ce soit une situation exceptionnelle. Comme vous le savez déjà, les exceptions survenues à l'intérieur d'une fonction asynchrone ne peuvent pas être attrapées via try-catch. Dans notre cas, l'exception survenue à l'intérieur de make ou du callback ne sera pas attrapée :

javascripttry {
  make(10, function(res) {
    console.log(res);
  });
} catch(err) {
  // ne sera pas attrapée
}

Dans l'approche par callbacks, on travaille avec les exceptions de la manière suivante : on envoie le résultat dans le premier paramètre du callback, et l'erreur dans le second. Dans ce cas, la gestion des erreurs se passe de la manière suivante :

javascriptmake(10, function(res, err) {
  if (!err) {
    console.log(res); // aucune erreur, affichons le résultat
  } else {
    console.log(err); // une erreur est survenue, affichons son texte
  }
});

Reconvertissons le code de notre fonction make conformément à ce qui a été décrit :

javascriptfunction make(num, callback) {
  setTimeout(function() {
    let arr = [1, 2, 3, 4, 5];
    
    let err;
    if (arr[num] === undefined) {
      err = 'elem not exists'; // texte de l'erreur
    } else {
      err = null; // pas d'erreur
    }
    
    callback(arr[num], err);
  }, 3000);
}