web-dev-qa-db-fra.com

Obtenez l'objet d'erreur Javascript réel avec window.onerror

Javascript a ce grand rappel window.onerror. Il est très pratique de suivre toute 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'un try...catch déclaration. L'objet d'erreur réel contient beaucoup plus de données, donc j'essaie d'obtenir cela. Malheureusement, try...catch l'instruction ne fonctionne pas correctement lorsque vous commencez à avoir du code asynchrone.

Existe-t-il un moyen de combiner et de tirer le meilleur parti des deux mondes? J'ai d'abord cherché un moyen d'obtenir l'erreur last déclenchée dans un bloc onerror, mais il semble que JS ne le stocke pas.

Un indice?

47
Julien Genestoux

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

La raison simple étant qu'une trace de pile est liée à un contexte d'exécution dans lequel des exceptions d'exécution (gérées avec try ... catch ... enfin) ont été créées ou levées (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 en inspectant window.event (non disponible sur FF) dans votre gestionnaire onerror.

10
Mrchief

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

le problème est que tous les navigateurs ne le prennent pas encore en charge, vous pouvez donc 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
Archaeron

Les navigateurs modernes prennent entièrement en charge le projet de spécification HTML 5 pour ErrorEvent et window.onerror. Dans ces deux navigateurs, vous pouvez utiliser window.onerror ou (étonnamment!) Vous lier correctement à l'événement 'error':

// 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
Fizer Khan