Récupérez L'objet D'erreur Javascript avec window.onerror

Javascript a ce grand rappel window.onerror . Il est assez pratique de suivre n'importe quelle erreur. Cependant, il appelle avec le nom d'erreur, le nom de fichier et la ligne. Ce n'est certainement pas aussi riche que d'obtenir l'objet d'erreur réel à partir d'une déclaration try...catch . L'objet d'erreur contient beaucoup plus de données, donc j'essaie d'obtenir cela. Malheureusement ,la déclaration try...catch ne fonctionne pas très bien lorsque vous commencez à avoir du code async.

est - il un moyen de combiner et obtenir le meilleur des deux mondes? J'ai d'abord cherché un moyen d'obtenir la dernière erreur déclenchée dans un bloc onerror , mais il semble que JS ne stocke pas cela.

un indice?

46
demandé sur Julien Genestoux 2011-08-18 00:34:35

3 réponses

si vous faites référence à la trace de la pile de l'objet d'erreur, alors AFAIK, ce n'est pas possible.

Simple raison étant qu'une trace de pile est liée à un contexte d'exécution dans lequel les exceptions d'exécution (traitées avec try...attraper...enfin) ont été créés ou jetés (avec new Error() ou throw ).

alors que lorsque window.onerror est invoqué, il est appelé dans un contexte différent.

vous pouvez obtenir un certain kilométrage par inspection de window.event (non disponible sur FF) dans votre handler onerror .

10
répondu Mrchief 2011-08-17 20:52:10

c'est maintenant possible dans certains navigateurs. Le spec a été mis à jour pour inclure l'erreur réelle avec stacktrace comme cinquième paramètre.

le problème est que tous les navigateurs ne le prennent pas encore en charge, donc vous pouvez faire quelque chose comme ceci:

window.onerror = function(message, filename, lineno, colno, error)
{
    if(error != null)
    {
        //handle the error with stacktrace in error.stack
    }
    else
    {
        //sadly only 'message', 'filename' and 'lineno' work here
    }
};
47
répondu Archaeron 2014-01-07 12:55:27

les navigateurs modernes prennent entièrement en charge le projet HTML 5 spec pour ErrorEvent et window.onerror . Dans ces deux navigateurs, vous pouvez utiliser window.onerror, ou (étonnamment!) se lient à la "erreur" événement correctement:

// Only Chrome & Opera pass the error object.
window.onerror = function (message, file, line, col, error) {
    console.log(message, "from", error.stack);
};
// Only Chrome & Opera have an error attribute on the event.
window.addEventListener("error", function (e) {
    console.log(e.error.message, "from", e.error.stack);
});
5
répondu Fizer Khan 2016-02-02 14:32:22