Как я могу получить трассировку стека JavaScript при выдаче исключения? - PullRequest
455 голосов
/ 26 февраля 2009

Если я сам сгенерирую исключение JavaScript (например, throw "AArrggg"), как я могу получить трассировку стека (в Firebug или иным способом)? Прямо сейчас я просто получаю сообщение.

edit : Как много людей из нижеприведенного, опубликовали, возможно получить трассировку стека для исключения JavaScript , но я хочу получить трассировку стека для my исключений. Например:

function foo() {
    bar(2);
}
function bar(n) {
    if (n < 2)
        throw "Oh no! 'n' is too small!"
    bar(n-1);
}

Когда вызывается foo, я хочу получить трассировку стека, которая включает вызовы foo, bar, bar.

Ответы [ 24 ]

0 голосов
/ 22 июля 2017

Просто попробуйте

throw new Error('some error here')

Это хорошо работает для хрома:

enter image description here

0 голосов
/ 22 января 2016

Использование console.error(e.stack) Firefox показывает только трассировку стека в журналах, Chrome также показывает сообщение. Это может быть неприятным сюрпризом, если сообщение содержит важную информацию. Всегда регистрируйте оба.

0 голосов
/ 03 октября 2015

Ничего себе - я не вижу ни одного человека в течение 6 лет, который предложил бы сначала проверить, доступен ли stack перед его использованием! Худшее, что вы можете сделать в обработчике ошибок, это вызвать ошибку из-за вызова чего-то, что не существует.

Как уже говорили другие, в то время как stack в большинстве случаев безопасно использовать, он не поддерживается в IE9 или более ранних версиях.

Я регистрирую свои непредвиденные ошибки, и трассировка стека довольно важна. Для максимальной поддержки я сначала проверяю, существует ли Error.prototype.stack и является ли он функцией. Если это так, то использовать error.stack безопасно.

        window.onerror = function (message: string, filename?: string, line?: number, 
                                   col?: number, error?: Error)
        {
            // always wrap error handling in a try catch
            try 
            {
                // get the stack trace, and if not supported make our own the best we can
                var msg = (typeof Error.prototype.stack == 'function') ? error.stack : 
                          "NO-STACK " + filename + ' ' + line + ':' + col + ' + message;

                // log errors here or whatever you're planning on doing
                alert(msg);
            }
            catch (err)
            {

            }
        };

Редактировать: Похоже, что поскольку stack является свойством, а не методом, его можно безопасно вызывать даже в старых браузерах. Я все еще в замешательстве, потому что я был уверен, что проверка Error.prototype раньше работала для меня, а теперь - нет, поэтому я не уверен, что происходит.

0 голосов
/ 04 марта 2009

Проще получить трассировку стека в Firefox, чем в IE, но в основном вот что вы хотите сделать:

Обернуть «проблемный» фрагмент кода в блок try / catch:

try {
    // some code that doesn't work
    var t = null;
    var n = t.not_a_value;
}
    catch(e) {
}

Если вы проверите содержимое объекта «ошибка», оно содержит следующие поля:

e.fileName: исходный файл / страница, с которой возникла проблема e.lineNumber: номер строки в файле / странице, где возникла проблема e.message: простое сообщение, описывающее тип ошибки e.name: тип возникшей ошибки, в приведенном выше примере это должно быть 'TypeError' e.stack: содержит трассировку стека, которая вызвала исключение

Надеюсь, это поможет вам.

...