web-dev-qa-db-fra.com

Comment déboguer "exception non interceptée: non définie (inconnue)" dans Firefox

J'ai cette ligne dans la console, uniquement dans Firefox, à partir de mon application JavaScript que je développe:

Console log of Exception

Il semble relativement inoffensif, mais je suis curieux de savoir s'il existe un moyen de déduire son origine, car il doit provenir de quelque part, même s'il prétend "inconnu". Envelopper le script entier dans un bloc try/catch et basculer le paramètre "Pause sur exception" de Firefox ne fait rien, ce qui semble impliquer que c'est une exception spéciale? J'ai quelques idées quelles parties de mon code pourraient être à l'origine de l'utilisation d'API Working Draft, mais je suis plus intéressé par la raison pour laquelle il rapporte de cette façon et ce que je peux y faire. Firefox ne fournit-il pas plus de détails?

15
MattTreichel

Il y a plusieurs façons d'essayer de supprimer ce bug.

Une chose qui est très fastidieuse mais qui vous donnera le numéro de ligne de l'exception est un code qui ressemble à:

foo();
console.log("Line 1");
bar();
console.log("Line 2");
baz();
console.log("Line 3");

et ainsi de suite, et si vous obtenez ceci dans la console:

Line 1
Line 2
Uncaught exception: undefined

alors vous savez que baz () était à l'origine de l'erreur. Une autre façon est d'utiliser le débogueur, comme ceci:

debugger;
foo();
bar();
baz();

et vous pouvez utiliser le débogueur de firefox pour parcourir chaque ligne et voir laquelle renvoie l'erreur à la console.

Si vous avez beaucoup de code, vous pouvez essayer l'astuce diviser pour mieux régner, comme ceci:

var fooStr = foo();
var fooArr = fooStr.split("");
fooArr = fooArr.reverse();
foo(fooArr.join(""));
console.log("Block one");

var barStr = bar();
var barArr = barStr.split("");
barArr = barArr.reverse();
bar(barArr.join(""));
console.log("Block two");

var bazStr = baz();
var bazArr = bazStr.split("");
bazArr = bazArr.reverse();
baz(bazArr.join(""));
console.log("Block three");

Ensuite, si la console ressemble à ceci:

Block one
Uncaught exception: undefined

Ensuite, le problème est dans le bloc 2. Ensuite, vous pouvez faire ceci:

var barStr = bar();
console.log("Line 1");
var barArr = barStr.split("");
console.log("Line 2");
barArr = barArr.reverse();
console.log("Line 3");
bar(barArr.join(""));
console.log("Line 4");
console.log("Block two");
console.log("Line 5");

Et si vous voyez:

Line 1
Uncaught exception: undefined

Vous savez alors que var barArr = barStr.split(""); est votre problème. À partir de là, vous voudrez peut-être enregistrer les valeurs des variables, comme ceci:

console.log(barStr);
var barArr = barStr.split("");

Et si vous voyez cela dans la console:

undefined
Uncaught exception: undefined

Vous savez alors que bar() renvoie undefined (au lieu d'une chaîne), qui n'a pas de méthode split. Ensuite, vous regardez le code à barres pour déterminer si, par exemple, vous avez oublié un paramètre? Mabey bar ressemble à ceci:

function bar(value){
    return strings[value];
}

et strings est un objet contenant quelque chose. Par conséquent, strings[undefined] Renverra undefined, qui n'a pas de méthode split. Bug écrasé!

4
programmer5000

J'ai trouvé un exemple simple qui reproduit l'erreur que vous voyez.

<!doctype html>
<html>

<head>
    <meta charset="utf-8">
    <script>
        throw undefined
    </script>
</head>

<body>
</body>

</html>

La console Firefox montre:

uncaught exception: undefined  (unknown)

C'est exactement ce que vous obtenez. Cela m'amène à croire que l'erreur se produit dans un script intégré à votre html.

Sachant que vous pouvez déplacer tous ces scripts vers leurs propres fichiers afin de pouvoir déboguer votre code normalement.

MISE À JOUR

Par accident, j'ai trouvé un autre moyen d'obtenir une telle erreur. Et il se présente sous la forme de eval.

index.html

<!doctype html>
<html>
<head>
  <script src="script.js"></script>
</head>
<body></body>
</html>

script.js

eval('throw undefined');
3
Niebieski

Vous pouvez aller sur about: config et créer une préférence booléenne dom.report_all_js_exceptions.
Cela forcera beaucoup plus d'exceptions à s'afficher dans la console d'erreurs.

https://developer.mozilla.org/en-US/docs/Archive/Mozilla/Exception_logging_in_JavaScript

1
Trung Duong