Attraper toutes les exceptions javascript non gérées


113

J'essaie de trouver ou de trouver un moyen d'afficher dans une boîte d'alerte toutes les exceptions javascript non gérées dans une application. Je voudrais que tout cela soit fait du côté client, sans utiliser de code côté serveur. J'utilise MVC3 comme environnement.

Je fais des recherches depuis quelques jours et je n'ai pas trouvé exactement ce que je cherchais.

J'ai trouvé 2 façons ci-dessous qui semblent être presque ce que je recherche, sauf que ces méthodes sont configurées de sorte que vous deviez passer un nom de fonction dans une méthode personnalisée pour imprimer la trace de la pile de toutes les exceptions non gérées dans celle-ci fonction spécifique. Je cherche un moyen de ne pas avoir à passer manuellement un nom de fonction à une méthode personnalisée qui imprime la trace de la pile de toutes les exceptions non gérées. Je voudrais que cette méthode personnalisée «écoute» simplement toutes les exceptions non gérées dans l'ensemble de l'application.

http://eriwen.com/javascript/js-stack-trace/

Également quelque chose de similaire au lien précédent:

https://github.com/eriwen/javascript-stacktrace

Voici le code de base du 2ème lien ci-dessus qui imprime la trace de pile d'une fonction javascript spécifiée:

instrumentFunction: function (context, functionName, callback) {
    context = context || window;
    var original = context[functionName];
    context[functionName] = function instrumented() {
        callback.call(this, printStackTrace().slice(4));
        return context[functionName]._instrumented.apply(this, arguments);
    };
    context[functionName]._instrumented = original;
}

function printStackTrace(options) {
    options = options || {
        guess: true
    };
    var ex = options.e || null,
        guess = !! options.guess;
    var p = new printStackTrace.implementation(),
        result = p.run(ex);
    return (guess) ? p.guessAnonymousFunctions(result) : result;
}

Donc, pour résumer cela, connaissez-vous tous un moyen d'avoir une sorte d '«auditeur» pour écouter toutes les exceptions javascript non gérées, puis les imprimer à l'écran dans une boîte d'alerte?

Merci! Jason


une chose ... pourquoi utiliseriez-vous une boîte d'alerte?!? vous pouvez utiliser console.log (message_erreur) pour ....
Mathlight

1
Je pense que cette question Catch all JS errors vous aidera
Pilgerstorfer Franz

Vous devriez probablement jeter un œil à cette question: stackoverflow.com/questions/205688/…
Mark

Réponses:


130

Vous pouvez le faire en utilisant la méthode window.onerror.

window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
    alert("Error occured: " + errorMsg);//or any message
    return false;
}

13
Bien mieux que d'essayer d'encapsuler toute mon application dans un bloc try / catch. :) Merci!
Anthony

15
Juste un avertissement: "Notez que certains / nombreux événements d'erreur ne déclenchent pas window.onerror, vous devez les écouter spécifiquement." - developer.mozilla.org/en-US/docs/Web/API/…
shusson

6
il n'est pas nécessaire d'inclure le nom de la fonction (myErrorHandler) dans ce code ... peut simplement être une fonction (errorMsg, url, lineNumber)
JoelFan

18
@JoelFan il est préférable d'avoir le nom de la fonction, à des fins de débogage. Le débogueur utilisera le nom de la fonction au lieu de s'afficher comme une fonction anonyme.
Jerinaw

C'est génial et merci! essayé de déboguer un script photo-zooming complexe qui fonctionne bien 100% du temps, sauf sur mobile safai où il échoue de manière aléatoire, et où il n'y a pas de fenêtre «console» ou «développeur» pour voir ce qui s'est passé. Bien sûr, j'ai ma propre fenêtre de «débogage» que je peux activer avec un bouton secret, mais je n'avais aucun moyen de voir globalement toutes les erreurs que je n'avais pas fait un essai / rattraper. Cet ajout m'a montré EXACTEMENT où était le problème et m'a épargné de me déchirer plus de cheveux! J'aimerais pouvoir voter deux fois!
Randy

48

Vous pouvez soit utiliser window.onerror, soit (étonnamment!) Lier correctement à l'événement 'error':

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

Si vous souhaitez suivre les erreurs JavaScript, vous pouvez essayer Atatus . Je travaille chez Atatus.


7
pourquoi êtes-vous une déclaration "return false"?
kumaresan_sd

@kumaresan_sd il permet au gestionnaire d'événements par défaut de se déclencher: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/...
Jens Bodal

29

En plus de

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

Vous pouvez également détecter toutes les erreurs déclenchées dans un callback ( .then()) de promesse à l' écoute d'un unhandledrejectionévénement

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

1
Est-il nécessaire d'utiliser les deux window.onerroret window.addEventListener("error", ou est-ce que l'un d'entre eux suffit?
Tormod Haugene

2
Vous pouvez en utiliser un. Si vous utilisez window.addEventListener("error", send useCaptureset to trueafin de détecter également les erreurs d'éléments qui n'ont pas surgi. developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Javier Perez

1
Je vous remercie!! L' errorévénement n'a pas attrapé mon erreur particulière. unhandledrejectionbien compris.
joe le

throw new Error('tja');n'est pas pris dans le dernier chrome avec cette approche ...
OZZIE

1
@JavierPerez J'ai testé en utilisant la v80 et j'ai jeté une erreur directement après et il n'a pas été attrapé, n'a pas non plus attrapé les erreurs de syntaxe.
OZZIE

1

Consultez http://log4javascript.org, il est basé sur Log4J. Si la plupart de votre code est encapsulé dans des instructions try / catch pour gérer les exceptions, vous pouvez utiliser cette bibliothèque comme interface commune pour envoyer la sortie à une "boîte de dialogue" ou une fenêtre de journalisation toujours disponible que votre utilisateur final pourrait voir. Vous pourriez même avoir un bouton qui exécute une window.print () pour imprimer le contenu de la boîte de dialogue sur l'imprimante ou le PDF. Bonne chance.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.