Как отлаживать "неперехваченное исключение: undefined (неизвестно)" в Firefox

У меня есть эта строка в консоли, только в Firefox, из моего приложения JavaScript, которое я разрабатываю:

Console log of Exception

Это кажется относительно безвредным, но мне любопытно, есть ли способ определить его происхождение, потому что он должен откуда-то прийти, даже если он утверждает, что "неизвестен". Завершение всего сценария в блок try/catch и переключение параметра Firefox "Pause on Exception" ничего не делает, что, по-видимому, подразумевает это специальное исключение? У меня есть некоторые идеи о том, какие части моего кода могут вызывать его при использовании API рабочих проектов, но меня больше интересует, почему он сообщает об этом и что я могу с этим сделать. Firefox не предоставляет больше деталей?

Ответ 1

Вот несколько способов, которые вы могли бы попробовать вырезать эту ошибку.

Одна вещь, которая очень утомительна, но вы получите номер строки исключения, это код, который выглядит так:

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

и т.д., и если вы получите это в консоли:

Line 1
Line 2
Uncaught exception: undefined

то вы знаете, что baz() вызывает ошибку. Другой способ - использовать отладчик, например:

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

и вы можете использовать отладчик firefox для перехода по каждой строке и посмотреть, какая из них выдает ошибку на консоль.

Если у вас много кода, вы можете попробовать трюк с разделением и победой, например:

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");

Затем, если консоль выглядит так:

Block one
Uncaught exception: undefined

Тогда проблема находится в блоке 2. Затем вы можете сделать это:

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");

И если вы видите:

Line 1
Uncaught exception: undefined

Тогда вы знаете, что var barArr = barStr.split(""); - ваша проблема. С этого момента вы можете регистрировать значения переменных, например:

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

И если вы видите это в консоли:

undefined
Uncaught exception: undefined

Тогда вы знаете, что bar() возвращает undefined (вместо строки), который не имеет метода split. Затем вы смотрите на код бара, чтобы определить, скажете ли вы, что вы забыли параметр? Mabey bar выглядит следующим образом:

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

и strings - объект с чем-то в нем. Поэтому strings[undefined] вернет undefined, который не имеет метода split. Буг раздавлен!

Ответ 2

Я нашел простой пример, который воспроизводит ошибку, которую вы видите.

<!doctype html>
<html>

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

<body>
</body>

</html>

Консоль firefox показывает:

uncaught exception: undefined  (unknown)

Это именно то, что вы получаете. Это заставляет меня думать, что ошибка возникает в script, который был встроен в ваш html.

Зная, что вы можете переместить все такие сценарии в свои собственные файлы, чтобы вы могли нормально отлаживать ваш код.

UPDATE

Случайно я нашел другой способ получить такую ​​ошибку. И он приходит в виде eval.

index.html

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

script.js

eval('throw undefined');