Javascript Stack Trace в IE (или, может быть, просто ошибка Javascript) - PullRequest
7 голосов
/ 01 октября 2009

Я наткнулся на этот метод, чтобы создать трассировку стека Javascript (чтобы исправить ошибку, специфичную для IE): http://pastie.org/253058.txt, что звучит действительно полезно, но когда я его вызываю, полученная трассировка стека предназначена для кода сам скрипт?!

Может ли этот код быть изменен для создания общей трассировки стека? Или есть лучший способ получить трассировку стека в IE?

(function () {

YOUR_NAMESPACE.getStackTrace = (function () {

var mode;
try {(0)()} catch (e) {
    mode = e.stack ? 'Firefox' : window.opera ? 'Opera' : 'Other';
}

switch (mode) {
    case 'Firefox' : return function () {
        try {(0)()} catch (e) {
            return e.stack.replace(/^.*?\n/,'').
                           replace(/(?:\n@:0)?\s+$/m,'').
                           replace(/^\(/gm,'{anonymous}(').
                           split("\n");
        }
    };

    case 'Opera' : return function () {
        try {(0)()} catch (e) {
            var lines = e.message.split("\n"),
                ANON = '{anonymous}',
                lineRE = /Line\s+(\d+).*?in\s+(http\S+)(?:.*?in\s+function\s+(\S+))?/i,
                i,j,len;

            for (i=4,j=0,len=lines.length; i<len; i+=2) {
                if (lineRE.test(lines[i])) {
                    lines[j++] = (RegExp.$3 ?
                        RegExp.$3 + '()@' + RegExp.$2 + RegExp.$1 :
                        ANON + RegExp.$2 + ':' + RegExp.$1) +
                        ' -- ' + lines[i+1].replace(/^\s+/,'');
                }
            }

            lines.splice(j,lines.length-j);
            return lines;
        }
    };

    default : return function () {
        var curr  = arguments.callee.caller,
            FUNC  = 'function', ANON = "{anonymous}",
            fnRE  = /function\s*([\w\-$]+)?\s*\(/i,
            stack = [],j=0,
            fn,args,i;

        while (curr) {
            fn    = fnRE.test(curr.toString()) ? RegExp.$1 || ANON : ANON;
            args  = stack.slice.call(curr.arguments);
            i     = args.length;

            while (i--) {
                switch (typeof args[i]) {
                    case 'string'  : args[i] = '"'+args[i].replace(/"/g,'\\"')+'"'; break;
                    case 'function': args[i] = FUNC; break;
                }
            }

            stack[j++] = fn + '(' + args.join() + ')';
            curr = curr.caller;
        }

        return stack;
    };
}

})();

Ответы [ 2 ]

12 голосов
/ 02 октября 2009

Эта getStackTrace() функция создает трассировку стека функции, из которой вы вызвали getStackTrace(). Он не создает трассировку стека ошибки, которую вы поймали. Например, вы использовали бы его, чтобы попытаться выяснить, как вызывается определенная функция:

function foo() {
    // debug how this is being called
    alert(YOUR_NAMESPACE.getStackTrace());
}

Или добавить более подробную информацию к сообщаемой вами ошибке:

function foo() {
    // signal something went wrong
    var error = new Error("error in foo");
    if (!error.stack)
        error.stack = YOUR_NAMESPACE.getStackTrace();
    throw error;
}

Вы можете не использовать это так:

try {
    foo();
} catch (e) {
    alert(YOUR_NAMESPACE.getStackTrace(e));
}

Вот краткое изложение того, какую информацию о стеке можно получить - и из каких браузеров - когда происходит ошибка: Три болезненных способа получить трассировку стека в Javascript (ссылка Archive.org заменяет мертвую ссылка)

0 голосов
/ 01 октября 2009

Возможно, вам лучше использовать встроенный отладчик IE 8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...