Если я сам создаю исключение JavaScript (например, throw "AArrggg"
), как я могу получить трассировку стека (в Firebug или иначе)? Прямо сейчас я просто получаю сообщение.
редактировать : как много людей ниже опубликовали, возможно получить трассировку стека для исключения JavaScript, но я хочу получить трассировку стека для моих исключений. Например:
function foo() {
bar(2);
}
function bar(n) {
if (n < 2)
throw "Oh no! 'n' is too small!"
bar(n-1);
}
Когда foo
называется, я хочу , чтобы получить трассировку стека , который включает в себя вызовы foo
, bar
, bar
.
javascript
stack-trace
Дэвид Волевер
источник
источник
throw 'arrrgh';
, и они выглядят так же, как и сthrow new Error('arrrgh');
. Отладчик Chrome все еще нуждаетсяthrow new Error('arrrgh');
в том, что заявлено, однако (но Chrome, кажется, дает намного более детальные следы).Ответы:
Изменить 2 (2017):
Во всех современных браузерах вы можете просто позвонить:
console.trace();
(MDN Reference)Изменить 1 (2013):
Лучшее (и более простое) решение, как указано в комментариях к исходному вопросу, заключается в использовании
stack
свойстваError
объекта следующим образом:Это сгенерирует вывод так:
Предоставление имени вызывающей функции вместе с URL, вызывающей функцией и т. Д.
Оригинал (2009):
Модифицированная версия этого фрагмента может несколько помочь:
источник
caller
теперь устарела иcallee
удалена из строгого режима ES5. Вот почему stackoverflow.com/questions/103598/…Обратите внимание, что chromium / chrome (другие браузеры, использующие V8), а также Firefox имеют удобный интерфейс для получения трассировки стека через свойство стека объектов Error .
Это относится как к базовым исключениям, так и к тем, которые вы бросаете сами. (Считается, что вы используете класс Error, который в любом случае является хорошей практикой).
Подробности смотрите в документации V8
источник
.stack
свойство.console.error(e.stack);
его так, чтобы оно выглядело как сообщение об исключении по умолчаниюВ Firefox кажется, что вам не нужно бросать исключение. Достаточно сделать
источник
window.onerror
, он показывает почти пустой стек только сonerror
функцией.console.log(new Error().stack)
> :(> :(> :(Если у вас есть firebug, на вкладке скрипта есть опция break on all errors. Как только сценарий достигнет вашей точки останова, вы можете посмотреть в окне стека firebug:
источник
Хорошее (и простое) решение, как указано в комментариях к исходному вопросу, заключается в использовании
stack
свойстваError
объекта следующим образом:Это сгенерирует вывод так:
Предоставление имени вызывающей функции вместе с URL и номером строки, ее вызывающей функцией и т. Д.
У меня есть действительно продуманное и красивое решение, которое я разработал для проекта, над которым я сейчас работаю, и я его немного извлек и переработал, чтобы обобщить. Вот:
Проверьте это на GitHub (в настоящее время v1.2)! Вы можете использовать его как,
Console.debug("Whatever");
и он, в зависимости от настроекConsole
, напечатает вывод и трассировку стека (или просто простую информацию / ничего лишнего вообще). Вот пример:Обязательно поиграйтесь с настройками
Console
объекта! Вы можете добавить интервал между линиями трассировки и полностью отключить его. Вот оно сConsole.trace
установленным наfalse
:Вы даже можете отключить первый бит отображаемой информации (установить
Console.settings.debug.showInfo
вfalse
) или полностью отключить отладку (установитьConsole.settings.debug.enabled
вfalse
), чтобы вам больше никогда не приходилось комментировать оператор отладки! Просто оставьте их, и это ничего не сделает.источник
Я не думаю, что есть что-то встроенное, что вы можете использовать, но я нашел много примеров, когда люди катались самостоятельно.
источник
throw { name: 'NameOfException', message: 'He's dead, Jim' }
.Вы можете получить доступ к
stack
(stacktrace
в Opera) свойствError
экземпляра, даже если вы бросили его. Дело в том, что вы должны убедиться, что вы используетеthrow new Error(string)
(не забудьте новое вместоthrow string
.Пример:
источник
С браузером Chrome вы можете использовать
console.trace
метод: https://developer.chrome.com/devtools/docs/console-api#consoletraceobjectисточник
Это даст трассировку стека (в виде массива строк) для современных Chrome, Opera, Firefox и IE10 +.
Применение:
Он исключает из стека свой собственный вызов, а также заголовок «Ошибка», который используется Chrome и Firefox (но не IE).
Он не должен падать в старых браузерах, а просто возвращать пустой массив. Если вам нужно более универсальное решение, посмотрите на stacktrace.js . Его список поддерживаемых браузеров действительно впечатляет, но, на мой взгляд, он очень большой для той небольшой задачи, для которой он предназначен: 37 КБ минимизированного текста, включая все зависимости.
источник
Обновление к ответу Юджина: объект ошибки должен быть брошен для IE (определенные версии?), Чтобы заполнить
stack
свойство. Следующее должно работать лучше, чем его текущий пример, и должно избегать возвратаundefined
в IE.Примечание 1: Подобные действия следует выполнять только при отладке и отключать при работе, особенно если они часто вызываются. Примечание 2: Это может работать не во всех браузерах, но, похоже, работает в FF и IE 11, что вполне соответствует моим потребностям.
источник
Один из способов получить реальную трассировку стека в Firebug - создать реальную ошибку, такую как вызов неопределенной функции:
Или используйте с
console.error()
последующимthrow
оператором, посколькуconsole.error()
показывает трассировку стека.источник
Этот полифилл-код работает в современных (2017) браузерах (IE11, Opera, Chrome, FireFox, Yandex):
Другие ответы:
не работает в IE 11!
Использование arguments.callee.caller - не работает в строгом режиме ни в одном браузере!
источник
В Google Chrome (версия 19.0 и выше) простое создание исключения работает отлично. Например:
покажет трассировку стека на выходе браузера:
Надеюсь, это поможет.
источник
функция:
вариант использования:
источник
этот скрипт покажет ошибку
источник
источник
В некотором роде поздно, но вот еще одно решение, которое автоматически определяет, если arguments.callee доступен, и использует новый Error (). Stack, если нет. Испытано в Chrome, Safari и Firefox.
2 варианта - stackFN (n) дает вам имя функции n вдали от непосредственного вызывающего, а stackArray () дает вам массив, stackArray () [0] является непосредственным вызывающим.
Попробуйте это на http://jsfiddle.net/qcP9y/6/
источник
Вы можете использовать эту библиотеку http://www.stacktracejs.com/ . Это очень хорошо
Из документации
источник
https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.js
- старая версия, самая последняя стабильная версия (соответствует фрагменту кода) здесь:https://raw.githubusercontent.com/stacktracejs/stacktrace.js/stable/stacktrace.js
Вот ответ, который дает вам максимальную производительность (IE 6+) и максимальную совместимость. Совместим с IE 6!
источник
Легче получить трассировку стека в Firefox, чем в IE, но в основном вот что вы хотите сделать:
Оберните «проблемный» фрагмент кода в блок try / catch:
Если вы изучите содержимое объекта «error», он содержит следующие поля:
e.fileName: исходный файл / страница, с которой возникла проблема. e.lineNumber: номер строки в файле / странице, на которой возникла проблема. e.message: простое сообщение с описанием типа ошибки. e.name: тип ошибки, которая произошла, в приведенном выше примере это должно быть 'TypeError' e.stack: содержит трассировку стека, вызвавшую исключение
Я надеюсь, что это помогает вам.
источник
Мне пришлось исследовать бесконечную рекурсию в smartgwt с IE11, поэтому для более глубокого исследования мне потребовалась трассировка стека. Проблема заключалась в том, что я не мог использовать консоль разработчика, потому что воспроизведение было сложнее.
Используйте следующее в методе javascript:
источник
Ничего себе - я не вижу ни одного человека за 6 лет, который предложил бы сначала проверить, есть ли
stack
в наличии, прежде чем его использовать! Худшее, что вы можете сделать в обработчике ошибок, это выдать ошибку из-за вызова чего-то, что не существует.Как уже говорили другие, в то время
stack
как в большинстве случаев безопаснее использовать, он не поддерживается в IE9 или более ранних версиях.Я регистрирую свои неожиданные ошибки, и трассировка стека довольно важна. Для максимальной поддержки я сначала проверяю,
Error.prototype.stack
существует ли она и является ли она функцией. Если это так, то это безопасно для использованияerror.stack
.Редактировать: Похоже, что поскольку
stack
это свойство, а не метод, вы можете безопасно вызывать его даже в старых браузерах. Я все еще в замешательстве, потому чтоError.prototype
раньше я был уверен, что проверка сработала для меня, а теперь - нет, поэтому я не уверен, что происходит.источник
Использование
console.error(e.stack)
Firefox показывает только трассировку стека в журналах, Chrome также показывает сообщение. Это может быть неприятным сюрпризом, если сообщение содержит важную информацию. Всегда регистрируйте оба.источник
Просто попробуй
Это работает очень хорошо для Chrome:
источник