web-dev-qa-db-fra.com

Gérer l'erreur de setTimeout

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

16
Andrew Kochnev

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)
28
slezica

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)   
})
11
Karlen

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);
1
Aluan Haddad