Question simple sur try-catch pour la fonction dans setTimeout
try {
setTimeout(function () {
throw new Error('error!');
}, 300)
} catch (e) {
console.log('eeee!')
console.log(e)
}
Pourquoi ne pas travailler avec catch-block?
Que puis-je lire à ce sujet?
P.S: Question sur la possibilité de gérer des erreurs comme celle-ci. Ne répond pas aux promesses
Les fonctions planifiées pour s'exécuter avec setTimeout
sont exécutées dans la boucle principale, en dehors du corps de code qui les a créées.
Pour gérer les erreurs, placez le try-catch
Dans le gestionnaire setTimeout
:
setTimeout(function () {
try {
throw new Error('error!');
} catch (e) {
console.error(e);
}
}, 300)
Si vous devez accéder à l'objet Error
à partir du bloc qui a appelé setTimeout
, utilisez Promises :
const promise = new Promise((resolve, reject) => {
setTimeout(function () {
try {
throw new Error('error!');
} catch (e) {
reject(e)
}
}, 300)
})
promise
.then(result => console.log("Ok " + result))
.catch(error => console.error("Ouch " + error))
Cet exemple ci-dessus n'est pas la manière la plus élégante de gérer le cas avec un Promise
. Au lieu de cela, implémentez une fonction delay(ms)
comme ceci:
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
Appelez ensuite
delay(300).then(myFunction).catch(handleError)
Vous pouvez trouver de bonnes explications dans cet officiel de Node.js doc .
Le problème est que lorsque le rappel de votre fonction setTimeout()
exécute le bloc try { } catch(err) { }
est déjà quitté. Notez également que le rappel peut bloquer le processus Node.js.
Cependant, si vous souhaitez gérer les erreurs dans le rappel de la fonction setTimeout()
, vous pouvez les écouter en utilisant process
objet EventEmitter global
process.on('uncaughtException', function(err){
console.log(err)
})
Parce que le bloc catch entoure lexicalement l'appel setTimeout
mais ce n'est pas la fonction qui lance. La traduction directe est
setTimeout(function () {
try {
throw new Error('error!');
} catch (e) {
console.log('eeee!');
console.log(e);
}
}, 300);