MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/MDN-dev-survey

Не стандартно
Эта возможность не является стандартной и стандартизировать её пока никто не собирается. Не используйте её на сайтах, смотрящих во внешний мир: она будет работать не у всех пользователей. Также могут присутствовать большие несовместимости между реализациями и её поведение может в будущем измениться.

Сводка

Нестандартное свойство stack объекта Error возвращает трассировку стека вызываемых функций в порядке их выполнения, вместе с номерами строк, именами файлов и аргументами. Строка со стеком заполняется от самых недавних вызовов до вызова из глобальной области видимости.

Описание

Каждый шаг находится на отдельной строке; первая часть строки содержит имя функции (если это не вызов из глобальной области видимости), затем знак собаки (@), местоположение файла (кроме случая, когда функция является конструктором ошибки, которую она выбрасывает), двоеточие и, если есть местоположение файла, номер строки. Обратите внимание, что объект Error также обладает свойствами fileName, lineNumber и columnNumber, позволяющими извлечь имя файла, номер строки и столбца из выброшенной ошибки (но только самой ошибки, а не всего стека вызовов).

Обратите внимание, что такой формат используется в Firefox. Нет никакого «стандартного формата». Однако, Safari 6+ и Opera 12- используют очень похожий формат. С другой стороны, браузеры, использующие движок JavaScript V8 (например, Chrome, Opera 15+, Браузер Android) и IE10+, используют другой формат (смотрите эту статью по error.stack в MSDN).

Значения аргументов в стеке: до Firefox 14 (ошибка 744842) за именем функции и прямо перед знаком собаки (@) в круглых скобках следовали значения аргументов, преобразованные в строки. Хотя объекты (или массивы и прочее) преобразовывались в форму "[object Object]", и, таким образом, невозможно было узнать их содержимое, скалярные значения могли быть извлечены (это всё ещё можно использовать в Firefox 14 — однако проще для получения аргументов использовать arguments.callee.caller.arguments, а для получения имени функции — arguments.callee.caller.name). Значение "undefined" показывалось как "(void 0)". Обратите внимание, что если строковые аргументы содержали значения, включающие символы "@", "(", ")" (или если они включали имена файлов), вам не так то просто было разбить строку на составные части. Таким образом, в Firefox 14 и более поздних версиях это перестало быть проблемой.

Примеры

Следующая разметка HTML демонстрирует использование свойства stack.

<!DOCTYPE HTML>
<meta charset="UTF-8">
<title>Пример трассировки стека</title>
<body>
<script>
function trace() {
  try {
    throw new Error('Моя ошибка');
  }
  catch(e) {
    alert(e.stack);
  }
}
function b() {
  trace();
}
function a() {
  b(3, 4, '\n\n', undefined, {});
}
a('первый вызов, первый аргумент');
</script>

Предполагается, что разметка выше сохранена как C:\example.html в файловой системе Windows. Она выводит следующий текст в диалоговом окне:

Начиная с Firefox 30 и более поздних версий, вывод содержит номер колонки (ошибка 762556):

trace@file:///C:/example.html:9:17
b@file:///C:/example.html:16:13
a@file:///C:/example.html:19:13
@file:///C:/example.html:21:9

с Firefox 14 по Firefox 29:

trace@file:///C:/example.html:9
b@file:///C:/example.html:16
a@file:///C:/example.html:19
@file:///C:/example.html:21

Firefox 13 и более ранние версии выводят следующий текст:

Error("Моя ошибка")@:0
trace()@file:///C:/example.html:9
b(3,4,"\n\n",(void 0),[object Object])@file:///C:/example.html:16
a("первый вызов, первый аргумент")@file:///C:/example.html:19
@file:///C:/example.html:21

Стек кода в функции eval()

Начиная с Firefox 30 (Firefox 30 / Thunderbird 30 / SeaMonkey 2.27 / Firefox OS 1.4), стек вызовов кода в вызовах Function() и eval() даёт более подробную информацию о номере строки и колонки внутри этих вызовов. Вызовы Function обозначаются "> Function", а вызовы eval() обозначаются "> eval". Смотрите ошибка 332176.

try {
  new Function('throw new Error()')();
} catch (e) {
  console.log(e.stack);
}

// anonymous@file:///C:/example.html line 7 > Function:1:1
// @file:///C:/example.html:7:6


try {
  eval("eval('FAIL')");
} catch (x) {
  console.log(x.stack);
}

// @file:///C:/example.html line 7 > eval line 1 > eval:1:1
// @file:///C:/example.html line 7 > eval:1:1
// @file:///C:/example.html:7:6

Также для именования исходного кода в функции eval() вы можете использовать директиву //# sourceURL. Смотрите раздел Отладка исходных кодов в функции eval() в документации по отладчику, а также эту запись в блоге (на английском).

Спецификации

Не является чаcтью какой-либо спецификации. Не стандартно.

Совместимость с браузерами

Возможность Chrome Firefox (Gecko) Internet Explorer Opera Safari
Базовая поддержка (Да) (Да) 10 (Да) 6
Возможность Android Chrome для Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Базовая поддержка Android 4 (возможно, Android 3, но не Android 2) ? ? ? ? 6

Смотрите также

Метки документа и участники

 Внесли вклад в эту страницу: Mingun
 Обновлялась последний раз: Mingun,