7

Как получить стек вызовов JavaScript при возникновении исключения?

1

Вопрос: Как получить стек вызовов при выбрасывании собственного исключения в 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 ответ(ов)

0

В Firefox, похоже, вам не обязательно выбрасывать исключение. Достаточно просто сделать следующее:

e = new Error();
console.log(e.stack);

Таким образом, вы можете получить стек вызовов без необходимости обработки исключений. Это полезно, когда вам нужно просто зарегистрировать текущее состояние выполнения кода, не прерывая его из-за ошибки.

0

Вы можете получить доступ к свойствам stack (в Opera — stacktrace) экземпляра Error, даже если вы его сами выбросили. Важно убедиться, что вы используете конструкцию throw new Error(string) (не забудьте про new, а не просто throw string).

Пример:

try {
    0++;
} catch (e) {
    var myStackTrace = e.stack || e.stacktrace || "";
}
0

В браузере Chrome вы можете использовать метод console.trace, который позволяет отслеживать стек вызовов кодов. Это может быть особенно полезно для отладки, так как он выводит путь выполнения до текущей точки. Вы можете ознакомиться с документацией на официальном сайте Chrome по следующей ссылке: https://developer.chrome.com/devtools/docs/console-api#consoletraceobject.

0

Обновление к ответу Евгения: Объект ошибки должен быть выброшен, чтобы Internet Explorer (конкретные версии?) заполнил свойство stack. Следующий код будет работать лучше, чем его текущий пример, и поможет избежать возвращения undefined в IE.

function stackTrace() {
  try {
    var err = new Error();
    throw err;
  } catch (err) {
    return err.stack;
  }
}

Примечание 1: Подобные действия следует выполнять только в процессе отладки и отключать в боевом режиме, особенно если функция вызывается часто. Примечание 2: Это может не работать во всех браузерах, но, похоже, работает в Firefox и IE 11, что вполне меня устраивает.

0

Чтобы получить реальный стек вызовов в Firebug, можно создать настоящую ошибку, например, вызвав неопределённую функцию:

function foo(b){
  if (typeof b !== 'string'){
    // создаем ошибку типа ChuckNorrisError для получения стека вызовов
    throw new ChuckNorrisError("Чак Норрис поймает тебя.");
  }
}

function bar(a){
  foo(a);
}

foo(123);

Также можно использовать console.error(), за которым следует оператор throw, так как console.error() выводит стек вызовов.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь