web-dev-qa-db-fra.com

Détectez tous les refus de promesses javascript non gérés

Je voudrais attraper toutes les exceptions/refus non gérés qui ont lieu dans une promesse javascript. Existe-t-il une bonne méthode pour les attraper sans ajouter de .catch(..) à chaque extrémité de la chaîne Promise? (en cas d'oubli de l'ajouter, l'erreur disparaît silencieusement).

La console développeur de Google Chrome peut les enregistrer, j'aime aussi les enregistrer dans un environnement de production.

Pour les exceptions javascript normales, j'utilise la fonction window.onerror, Mais les erreurs d'une promesse appellent cette fonction.

Exemple:

window.onerror = function (e) {
    alert("unhandled error: " + e);
};

var p = new Promise(function (resolve, reject) {
    var nullObject = null;
    // Raise a TypeError: Cannot read property 'forceNullError' of null
    var x = nullObject.forceNullError(); 
    resolve();
});

p.then(function () { alert('success'); });

JSFiddle: https://jsfiddle.net/f7zwej6L/

*) J'ai remarqué que WinJS a une méthode .done(..) pour ce que je veux, mais pas les promesses natives.

44
Peter Mols

Le monde entier attend les événements unhandledrejection et rejectionhandled. Depuis mars 2016, Chrome est maintenant le premier à le prendre en charge.

Exemple:

window.addEventListener('unhandledrejection', function(event) {
    console.error('Unhandled rejection (promise: ', event.promise, ', reason: ', event.reason, ').');
});

Spécifications: HTML Living Standard

Développeur Mozilla: onrehandledhandled , onunhandledrejection

Problèmes de chrome: 495801 , 9391

74
Valentin Shergin

Notez que dans Node l'événement est appelé unhandledRejection:

process.on('unhandledRejection', function(err, promise) {
    console.error('Unhandled rejection (promise: ', promise, ', reason: ', err, ').');
});

Sur la version 12+, le nœud se terminera sur ces refus.

19
Benjamin Gruenbaum

Certaines bibliothèques ont leurs propres API pour ce faire. Certains navigateurs signalent (tôt ou tard) les refus non gérés.

En fait, done fait probablement pas faites ce que vous voulez. C'est pourquoi cela ne fait pas partie de la spécification. Dans tous les cas, vous devez toujours vous rappeler de l'appeler.

Il n'y a aucun moyen fiable, multiplateforme et multi-bibliothèques de le faire.

3
user663031

bibliothèque non capturée peut vous aider à détecter les refus de promesse non gérés.

Et il gère également les erreurs non détectées.

[~ # ~] modifier [~ # ~]

<script type="text/javascript" src=".../uncaught/lib/index.js"></script>

<script type="text/javascript">
    uncaught.start();
    uncaught.addListener(function (error) {
        console.log('Uncaught error or rejection: ', error.message);
    });
</script>

L'avantage de cette approche est la seule interface qui vous permet de gérer à la fois les erreurs non détectées et les rejets de promesses non gérés.

1