Как получить стек вызовов JavaScript при возникновении исключения?
Вопрос: Как получить стек вызовов при выбрасывании собственного исключения в JavaScript?
Если я сам выбрасываю исключение в JavaScript (например, throw "AArrggg"
), как я могу получить стек вызовов (в Firebug или любом другом инструменте)? В настоящий момент я просто получаю сообщение об ошибке.
Редактирование: Как многие из вас отметили, можно получить стек вызовов для JavaScript исключений, но я хочу получить стек вызовов для собственных исключений. Например:
function foo() {
bar(2);
}
function bar(n) {
if (n < 2)
throw "О нет! 'n' слишком маленькое!"
bar(n-1);
}
Когда вызывается foo
, я хочу получить стек вызовов, который будет включать вызовы foo
, bar
, bar
. Как это можно реализовать?
5 ответ(ов)
В Firefox, похоже, вам не обязательно выбрасывать исключение. Достаточно просто сделать следующее:
e = new Error();
console.log(e.stack);
Таким образом, вы можете получить стек вызовов без необходимости обработки исключений. Это полезно, когда вам нужно просто зарегистрировать текущее состояние выполнения кода, не прерывая его из-за ошибки.
Вы можете получить доступ к свойствам stack
(в Opera — stacktrace
) экземпляра Error
, даже если вы его сами выбросили. Важно убедиться, что вы используете конструкцию throw new Error(string)
(не забудьте про new, а не просто throw string
).
Пример:
try {
0++;
} catch (e) {
var myStackTrace = e.stack || e.stacktrace || "";
}
В браузере Chrome вы можете использовать метод console.trace
, который позволяет отслеживать стек вызовов кодов. Это может быть особенно полезно для отладки, так как он выводит путь выполнения до текущей точки. Вы можете ознакомиться с документацией на официальном сайте Chrome по следующей ссылке: https://developer.chrome.com/devtools/docs/console-api#consoletraceobject.
Обновление к ответу Евгения: Объект ошибки должен быть выброшен, чтобы Internet Explorer (конкретные версии?) заполнил свойство stack
. Следующий код будет работать лучше, чем его текущий пример, и поможет избежать возвращения undefined
в IE.
function stackTrace() {
try {
var err = new Error();
throw err;
} catch (err) {
return err.stack;
}
}
Примечание 1: Подобные действия следует выполнять только в процессе отладки и отключать в боевом режиме, особенно если функция вызывается часто. Примечание 2: Это может не работать во всех браузерах, но, похоже, работает в Firefox и IE 11, что вполне меня устраивает.
Чтобы получить реальный стек вызовов в Firebug, можно создать настоящую ошибку, например, вызвав неопределённую функцию:
function foo(b){
if (typeof b !== 'string'){
// создаем ошибку типа ChuckNorrisError для получения стека вызовов
throw new ChuckNorrisError("Чак Норрис поймает тебя.");
}
}
function bar(a){
foo(a);
}
foo(123);
Также можно использовать console.error()
, за которым следует оператор throw
, так как console.error()
выводит стек вызовов.
Где найти документацию по форматированию даты в JavaScript?
В чем разница между String.slice и String.substring?
Проверка соответствия строки регулярному выражению в JS
Как создать диалог с кнопками "Ок" и "Отмена"
Как определить нажатие клавиши Esc?