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 :
try {
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 :
make(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 :
function 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);
}