Как отладить необработанное исключение: undefined (неизвестно) в Firefox

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

Консольный журнал исключений

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


person MattTreichel    schedule 06.01.2017    source источник
comment
Используйте другой браузер. Chrome иногда помогает устранить проблемы, которые Firefox (или Firebug) не обнаружит.   -  person user2182349    schedule 06.01.2017
comment
@user2182349 user2182349 Ну, эта проблема вообще не появляется в Chrome. Это не очень важно для решения, мне просто любопытно, есть ли способ взаимодействовать с такой проблемой или почему Firefox это делает.   -  person MattTreichel    schedule 06.01.2017
comment
когда вы открываете отладчик, на вкладке отладчика, когда вы нажимаете шестеренку с правой стороны. есть опция, называемая паузой при исключении, также хотите отменить выбор игнорирования перехваченных исключений, а затем перезагрузить страницу   -  person tik27    schedule 18.01.2017
comment
У меня когда-то была такая проблема. Это было из-за ограничения Firefox на размер документов, который, я думаю, составлял 768 КБ. Проверьте размер документа, который вы извлекаете.   -  person Luís Assunção    schedule 18.01.2017
comment
@ tik27 А, это очевидная вещь, о которой я не знал, спасибо. Однако, пытаясь это сделать, он, кажется, игнорирует эти неперехваченные исключения. Значит, есть в них что-то ненормальное. Если установлен флажок «Игнорировать перехваченные исключения», это также не имеет значения, но кажется забавным, что если он отмечен, приостановка явно игнорирует то, что сам Firefox называет неперехваченным исключением.   -  person MattTreichel    schedule 19.01.2017


Ответы (3)


Есть несколько способов, которыми вы можете попытаться устранить эту ошибку.

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

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. Затем вы смотрите на код бара, чтобы определить, скажем, вы забыли параметр? Мэйби bar выглядит так:

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

а strings — это объект, в котором что-то есть. Следовательно, strings[undefined] вернет undefined, у которого нет метода split. Ошибка устранена!

person Community    schedule 19.01.2017
comment
Я ценю усилия, но я знаю об отладке console.log. Выполняя ваш пример '.split()', Firefox возвращает TypeError: barStr is undefined - гораздо более описательная ошибка, чем та, с которой я имею дело, поэтому я не уверен, понимаете ли вы, о чем я здесь спрашиваю. Я попробовал команду отладчика Firefox, но она, похоже, привела к сбою браузера, когда я взаимодействовал со страницей во время паузы, и хотя я не упомянул об этом, мой код постоянно выполняется в кадрах анимации, поэтому console.logging и пошаговое выполнение кода недостаточно, чтобы поймать точный кадр, в котором возникает ошибка. - person MattTreichel; 19.01.2017
comment
Не обращайте внимания на пример кода .split(). Попробуйте поставить console.log("Dev console!") в начало файла и запустить его. Если вы ничего не видите в консоли, у вас отдельная проблема. В противном случае ставьте console.log() после каждой строки, чтобы найти строку, нарушающую правила. - person ; 20.01.2017
comment
Если это был ответ, который вы ищете, или он хорошо ответил на ваш вопрос, отметьте его как принятый. В противном случае объясните, что вы ищете, в комментарии или отредактируйте свой вопрос. - person ; 24.01.2017
comment
Я уже отредактировал его, уточнив, что у меня есть некоторые идеи о том, какие части моего кода могут быть причиной этого, которые используют API-интерфейсы рабочего проекта, но меня больше интересует, почему он сообщает об этом таким образом и что я могу с этим поделать. Я не пытаюсь определить местонахождение ошибки, на чем сосредоточена большая часть этого ответа, но почему Firefox выдает то, что кажется уникальным и бесполезным исключением. Инструменты браузера или механизмы try-catch должны помочь объяснить что-то подобное, если бы это было обычное исключение, но, похоже, это не так. - person MattTreichel; 24.01.2017
comment
Метод проб и ошибок console.logging всего моего сценария кажется действительно утомительным упражнением, особенно в сочетании со сложной логикой, а чрезмерное использование console.logging, похоже, приводит к сбою браузера, если выполняется каждый кадр анимации. - person MattTreichel; 24.01.2017
comment
Разделите его на разделы. Сначала console.log один раз в начале каждого кадра анимации. Если вы видите только 1 журнал, вы знаете, что в первый раз создается исключение. Если это произойдет, поместите журнал на 0%, 25%, 50% и 75% в коде фрейма. Если вы видите 2 элемента в журнале, вы знаете, что исключение произошло между 2-м и 3-м операторами журнала (между 20% и 50%). Затем вы можете разделить этот раздел кода на 0%, 25%, 50% и т. д. , пока не дойдете до 1 строки. Если это вызов функции, разделите функцию, если нет, то это ошибка. См. графическое объяснение - person ; 24.01.2017

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

<!doctype html>
<html>

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

<body>
</body>

</html>

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

uncaught exception: undefined  (unknown)

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

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

ОБНОВЛЕНИЕ

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

index.html

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

script.js

eval('throw undefined');
person Niebieski    schedule 23.01.2017
comment
Интересно, но у меня нет встроенных скриптов, только один внешний файл. Я думаю, это может иметь какое-то отношение к тому, как Firefox обрабатывает исключения во внутреннем коде. - person MattTreichel; 24.01.2017

Вы можете перейти к about:config и создать логическое предпочтение dom.report_all_js_exceptions.
Это приведет к тому, что в консоли ошибок появится намного больше исключений.

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

person Trung Duong    schedule 23.01.2017
comment
Я не вижу эту опцию в моем about:config. Я использую Firefox 50 (текущая версия?). - person MattTreichel; 24.01.2017
comment
Вы можете перейти к about:config, щелкнуть правой кнопкой мыши список настроек, затем в контекстном меню выбрать Создать/логическое значение, ввести dom.report_all_js_exceptions для имени и true для значения. - person Trung Duong; 24.01.2017
comment
Спасибо, я попробовал и перезапустил браузер, но это не помогло решить эту проблему. - person MattTreichel; 24.01.2017
comment
Я когда-то сталкивался с такой ошибкой. Трудно найти причину. Иногда эта ошибка может быть вызвана кодом, использующим функцию setTimeout, вы должны это проверить. - person Trung Duong; 24.01.2017
comment
Хм, у меня довольно много кода, который использует setTimeout, поэтому его будет сложно найти. Но это хороший возможный ключ. - person MattTreichel; 24.01.2017
comment
Распространенная ошибка, которую обычно делают наши сотрудники, заключается в том, что они вызывают функцию непосредственно внутри setTimeout, например: они используют setTimeout(functionA(), 0) вместо setTimeout(function(){ functionA( ) }, 0). Это приведет к возникновению ошибки undefined. - person Trung Duong; 24.01.2017