Je souhaite utiliser onerror pour intercepter et enregistrer toutes les erreurs qui se produisent dans mon application JavaScript. Cela fonctionne comme prévu, sauf lors de l'utilisation de promesses ou de fonctions asynchrones.

Dans ce qui suit Snipped l'exception levée par fail est interceptée comme prévu, mais rejectPromise et throwAsync au lieu d'appeler le gestionnaire onerror montrent toujours Uncaught (in promise) Error dans la console?

Comment puis-je toujours intercepter toutes les erreurs dans une base de code qui utilise des promesses et des fonctions asynchrones ?

window.onerror = function(message, source, lineno, colno, error) {
  console.log('onerror handler logging error', message);
  return true;
}

function rejectPromise() {
  return Promise.reject(new Error('rejected promise'));
}

async function throwAsync() {
  throw new Error('async exception');
}

function fail() {
  throw new Error('exception');
}

rejectPromise().then(() => console.log('success'));
throwAsync();
fail();
9
doberkofler 15 mars 2019 à 11:42

2 réponses

Meilleure réponse

Vous pouvez ajouter un gestionnaire de fenêtre pour onunhandledrejection, car les rejets de promesse non gérés ne sont pas exactement les mêmes choses que les erreurs. Vérifiez les résultats de l'extrait ci-dessous dans votre console de navigateur (pas la console d'extrait, elle aura des problèmes en essayant d'afficher le gros objet) :

window.onerror = function(message, source, lineno, colno, error) {
  console.log('onerror handler logging error', message);
  return true;
}
window.onunhandledrejection = function(message, source, lineno, colno, error) {
  console.log('onunhandledrejection handler logging error', message);
  return true;
}


function rejectPromise() {
  return Promise.reject(new Error('rejected promise'));
}

async function throwAsync() {
  throw new Error('async exception');
}

function fail() {
  throw new Error('exception');
}

rejectPromise().then(() => console.log('success'));
throwAsync();
fail();
9
CertainPerformance 15 mars 2019 à 08:47

Vous pouvez ajouter addEventListener pour résoudre ce problème car throw new Exception() déclenchera un événement d'erreur. Donc fail() déclenchera un événement error

window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

window.addEventListener('unhandledrejection', function (e) {
  alert("Error occurred: " + e.reason.message);
})

J'espère que cela t'aides !!

3
vizsatiz 15 mars 2019 à 08:48