Як я можу отримати слід стека JavaScript, коли я кидаю виняток?


519

Якщо я сам кидаю виняток 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.


1
можливий дублікат сліду стека винятків Javascript
ripper234

Помилка все ще відкрита в Firebug tracker bug з 2008 року: code.google.com/p/fbug/isissue/detail?id=1260 - позначте її зірочкою!
Міллер Медейрос

13
Відповідь повинна бути "кинути нову помилку ('arrrgh');" дивіться цю прекрасно написану сторінку: devthought.com/2011/12/22/a-string-is-not-an-error
елегантні кубики

1
(2013) Тепер ви можете отримати сліди стека у Firebug на Firefox, навіть якщо це просто throw 'arrrgh';, і вони здаються такими ж, як і в throw new Error('arrrgh');. throw new Error('arrrgh');Однак налагоджувач Chrome все ще потребує, як зазначено (але, здається, Chrome дає набагато більш детальні сліди).
user56reinstatemonica8

26
@ChetanSastry Я погуглився на "слід стека Javascript", і це був перший результат
Девід Сайкс

Відповіді:


756

Редагувати 2 (2017):

У всіх сучасних браузерах ви можете просто зателефонувати: console.trace(); (довідник MDN)

Редагувати 1 (2013):

Кращим (і простішим) рішенням, як зазначено в коментарях до оригінального питання, є використання stackвластивості Errorоб'єкта на зразок:

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

Це дасть вихід таким чином:

DBX.Utils.stackTrace@http://localhost:49573/assets/js/scripts.js:44
DBX.Console.Debug@http://localhost:49573/assets/js/scripts.js:9
.success@http://localhost:49573/:462
x.Callbacks/c@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
x.Callbacks/p.fireWith@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
k@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6
.send/r@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6

Надання імені функції виклику разом із URL-адресою, її функцією виклику тощо.

Оригінал (2009):

Змінена версія цього фрагмента може дещо допомогти:

function stacktrace() { 
  function st2(f) {
    return !f ? [] : 
        st2(f.caller).concat([f.toString().split('(')[0].substring(9) + '(' + f.arguments.join(',') + ')']);
  }
  return st2(arguments.callee.caller);
}

11
Я не впевнений, чому за це не проголосували більше - інші відповіді не так добре працювали для мене. BTW, не переглядайте аргументи як масив (оновлений фрагмент тут: gist.github.com/965603 )
ripper234

1
не працює в chrome, tacktrace (): [Виняток: TypeError: У об’єкта # <Object> немає методу
hetaoblog

3
дивіться коментар до оригінального питання: вам не потрібен спеціальний код, просто використовуйте "кинути нову помилку ('arrrgh')"
Джошуа Річардсон,

16
Error.stack не визначений в IE, працює лише в хромі та Mozilla firefox
Philipp Munin

4
Зауважте, що callerтепер застаріле і calleeвилучено із суворого режиму ES5. Ось чому stackoverflow.com/questions/103598 / ...
PhilT

187

Зауважте, що хром / хром (інші браузери, що використовують V8), а також Firefox мають зручний інтерфейс для отримання стек- трек через властивість стека на об'єктах помилок .

try {
   // Code throwing an exception
} catch(e) {
  console.log(e.stack);
}

Це стосується базових винятків, а також тих, які ви кидаєте. (Зважаючи на те, що ви використовуєте клас Помилка, що все одно є хорошою практикою).

Дивіться детальну інформацію про документацію на V8


12
Firefox також підтримує .stackвластивість.
kennytm

2
Я б хотів, щоб я міг отримати 100 разів! Дякую, Джоселін. Це дійсно дуже допомогло
safrazik

1
Ви також можете використовувати console.error(e.stack);так, що це виглядає як повідомлення про виключення за замовчуванням
Бруно Перес,

80

У Firefox здається, що викид не потрібно викидати. Це досить зробити

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

Працює і в мобільних додатках (створених за допомогою JQM).
Самік Р

Працює і в Chromium (версія 43 все одно).
Енді Беверлі

У Firefox 59 це не працює при виклику через window.onerror, він показує майже порожній стек з лише onerrorфункцією.
Code4R7

Ще краще, ви могли б зробити: console.log(new Error().stack)> :(> :(> :(
Андрій

25

Якщо у вас є firebug, на вкладці сценарію є перерва на всі варіанти помилок. Після того, як сценарій потрапив у вашу точку розриву, ви можете переглянути вікно стека firebug:

скріншот


5
Грм, це, здається, не працює. Він зупиняє мене на відладчику на помилках, викликаних Javascript (наприклад, невизначені помилки змінної), але коли я кидаю власні винятки, я все одно не отримую нічого, крім повідомлення "Невиконаний виняток".
Девід Волвер

11

Хорошим (і простим) рішенням, як зазначено в коментарях до оригінального питання, є використання stackвластивості Errorоб'єкта на зразок:

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

Це дасть вихід таким чином:

DBX.Utils.stackTrace@http://localhost:49573/assets/js/scripts.js:44
DBX.Console.Debug@http://localhost:49573/assets/js/scripts.js:9
.success@http://localhost:49573/:462
x.Callbacks/c@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
x.Callbacks/p.fireWith@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
k@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6
.send/r@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6

Присвоєння імені функції виклику разом із URL-адресою та номером лінії, її функцією дзвінка тощо.

У мене є дійсно продумане і гарне рішення, яке я розробив для проекту, над яким я зараз працюю, і я його видобув і переробив трохи для узагальнення. Ось:

(function(context){
    // Only global namespace.
    var Console = {
        //Settings
        settings: {
            debug: {
                alwaysShowURL: false,
                enabled: true,
                showInfo: true
            },
            stackTrace: {
                enabled: true,
                collapsed: true,
                ignoreDebugFuncs: true,
                spacing: false
            }
        }
    };

    // String formatting prototype function.
    if (!String.prototype.format) {
        String.prototype.format = function () {
            var s = this.toString(),
                args = typeof arguments[0],
                args = (("string" == args || "number" == args) ? arguments : arguments[0]);
            if (!arguments.length)
                return s;
            for (arg in args)
                s = s.replace(RegExp("\\{" + arg + "\\}", "gi"), args[arg]);
            return s;
        }
    }

    // String repeating prototype function.
    if (!String.prototype.times) {
        String.prototype.times = function () {
            var s = this.toString(),
                tempStr = "",
                times = arguments[0];
            if (!arguments.length)
                return s;
            for (var i = 0; i < times; i++)
                tempStr += s;
            return tempStr;
        }
    }

    // Commonly used functions
    Console.debug = function () {
        if (Console.settings.debug.enabled) {
            var args = ((typeof arguments !== 'undefined') ? Array.prototype.slice.call(arguments, 0) : []),
                sUA = navigator.userAgent,
                currentBrowser = {
                    firefox: /firefox/gi.test(sUA),
                    webkit: /webkit/gi.test(sUA),
                },
                aLines = Console.stackTrace().split("\n"),
                aCurrentLine,
                iCurrIndex = ((currentBrowser.webkit) ? 3 : 2),
                sCssBlack = "color:black;",
                sCssFormat = "color:{0}; font-weight:bold;",
                sLines = "";

            if (currentBrowser.firefox)
                aCurrentLine = aLines[iCurrIndex].replace(/(.*):/, "$1@").split("@");
            else if (currentBrowser.webkit)
                aCurrentLine = aLines[iCurrIndex].replace("at ", "").replace(")", "").replace(/( \()/gi, "@").replace(/(.*):(\d*):(\d*)/, "$1@$2@$3").split("@");

            // Show info if the setting is true and there's no extra trace (would be kind of pointless).
            if (Console.settings.debug.showInfo && !Console.settings.stackTrace.enabled) {
                var sFunc = aCurrentLine[0].trim(),
                    sURL = aCurrentLine[1].trim(),
                    sURL = ((!Console.settings.debug.alwaysShowURL && context.location.href == sURL) ? "this page" : sURL),
                    sLine = aCurrentLine[2].trim(),
                    sCol;

                if (currentBrowser.webkit)
                    sCol = aCurrentLine[3].trim();

                console.info("%cOn line %c{0}%c{1}%c{2}%c of %c{3}%c inside the %c{4}%c function:".format(sLine, ((currentBrowser.webkit) ? ", column " : ""), ((currentBrowser.webkit) ? sCol : ""), sURL, sFunc),
                             sCssBlack, sCssFormat.format("red"),
                             sCssBlack, sCssFormat.format("purple"),
                             sCssBlack, sCssFormat.format("green"),
                             sCssBlack, sCssFormat.format("blue"),
                             sCssBlack);
            }

            // If the setting permits, get rid of the two obvious debug functions (Console.debug and Console.stackTrace).
            if (Console.settings.stackTrace.ignoreDebugFuncs) {
                // In WebKit (Chrome at least), there's an extra line at the top that says "Error" so adjust for this.
                if (currentBrowser.webkit)
                    aLines.shift();
                aLines.shift();
                aLines.shift();
            }

            sLines = aLines.join(((Console.settings.stackTrace.spacing) ? "\n\n" : "\n")).trim();

            trace = typeof trace !== 'undefined' ? trace : true;
            if (typeof console !== "undefined") {
                for (var arg in args)
                    console.debug(args[arg]);

                if (Console.settings.stackTrace.enabled) {
                    var sCss = "color:red; font-weight: bold;",
                        sTitle = "%c Stack Trace" + " ".times(70);

                    if (Console.settings.stackTrace.collapsed)
                        console.groupCollapsed(sTitle, sCss);
                    else
                        console.group(sTitle, sCss);

                    console.debug("%c" + sLines, "color: #666666; font-style: italic;");

                    console.groupEnd();
                }
            }
        }
    }
    Console.stackTrace = function () {
        var err = new Error();
        return err.stack;
    }

    context.Console = Console;
})(window);

Перевірте це на GitHub (зараз v1.2)! Ви можете використовувати його як Console.debug("Whatever");і він, залежно від налаштувань у Console, буде надрукувати вихідний та стековий стек (або просто просту інформацію / взагалі нічого зайвого). Ось приклад:

Console.js

Обов’язково пограйте з налаштуваннями в Consoleоб’єкті! Ви можете додати проміжки між рядками сліду і повністю вимкнути його. Ось він Console.traceвстановлений на false:

Ні сліду

Ви навіть можете відключити перший біт інформації , показаний (набір Console.settings.debug.showInfoдля false) або відключити налагодження повністю (набір Console.settings.debug.enabledв false) , так що ви ніколи не повинні закомментировать отладочную ще раз! Просто залиште їх, і це нічого не зробить.


10

Я не думаю, що в цьому є щось, що ви можете використати, але я знайшов багато прикладів людей, котиться до своїх.


А, дякую - перше посилання там, схоже, може зробити (хоча відсутність підтримки рекурсії може зробити його непрацездатним).
Девід Уолвер

Так, я не бачив жодної, яка підтримувала б рекурсію з першого погляду. Мені буде цікаво дізнатися, чи є в цьому хороше рішення.
Марк Бік

1
Я думаю, що друге посилання повинно підтримувати рекурсію для Firefox і Opera, оскільки воно використовує трасування стека помилок, а не вручну будувати його за допомогою змінної аргументів. Я хотів би почути, якщо ви знайдете рішення для перегляду веб-переглядача для проблеми рекурсії (перша стаття - моя). :)
Гелефант

Helephant: Другий тут не працюватиме, тому що, коли я вловлю виняток, це "рядок" (тобто не "e.stack"): foo = function () {кинути "Arg"; } спробуйте {foo (); } catch (e) {/ * typeof e == "string" * /} Можливо, я його неправильно кидаю? (почніть обов'язковий рент про те, наскільки дурні підручники Javascript ...)
Девід Волвер

Спробуйте кинути об'єкт: throw { name: 'NameOfException', message: 'He's dead, Jim' }.
Аарон Дігулла

7

Ви можете отримати доступ до властивостей stack( stacktraceв Opera) Errorекземпляра, навіть якщо ви кинули його. Вся справа в тому, що вам потрібно переконатися, що ви використовуєте throw new Error(string)(не забудьте нове замістьthrow string .

Приклад:

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

stacktrace не працює в Opera. Я навіть не можу щось про це знайти.
NVI

@NV: Здається, стек-трак не на помилках, створених користувачем, тому слід зробити це замість цього: спробуйте {0 ++} catch (e) {myStackTrace = e.stack || e.stacktrace}
Елі Грей


7

Це дасть слід стеку (як масив рядків) для сучасних Chrome, Opera, Firefox та IE10 +

function getStackTrace () {

  var stack;

  try {
    throw new Error('');
  }
  catch (error) {
    stack = error.stack || '';
  }

  stack = stack.split('\n').map(function (line) { return line.trim(); });
  return stack.splice(stack[0] == 'Error' ? 2 : 1);
}

Використання:

console.log(getStackTrace().join('\n'));

Він виключає зі стека власний виклик, а також назву "Помилка", яку використовують Chrome та Firefox (але не IE).

Він не повинен виходити з ладу у старих браузерах, а лише повертати порожній масив. Якщо вам потрібно більш універсальне рішення, подивіться на stacktrace.js . Перелік підтримуваних браузерів дуже вражає, але, на мій погляд, він дуже великий для цієї невеликої задачі, для якої він призначений: 37 Кб укороченого тексту, включаючи всі залежності.


7

Оновлення відповіді Євгенія: Об'єкт помилки повинен бути кинутий, щоб IE (конкретні версії?) Заповнив stackвластивість. Наступні повинні працювати краще, ніж його теперішній приклад, і уникати повернення undefinedв IE.

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

Примітка 1: Таку річ слід робити лише під час налагодження, а вимикати її в прямому ефірі, особливо, якщо дзвонити часто. Примітка 2: Це може працювати не у всіх браузерах, але, здається, працює у FF та IE 11, що добре відповідає моїм потребам.


6

один із способів отримати реальний слід стека на Firebug - це створити реальну помилку, як-от виклик невизначеної функції:

function foo(b){
  if (typeof b !== 'string'){
    // undefined Error type to get the call stack
    throw new ChuckNorrisError("Chuck Norris catches you.");
  }
}

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

foo(123);

Або використовуйте console.error()наступний throwоператор, оскільки console.error()показує стеження стека.


4

Цей код полізаповнення працює у сучасних браузерах (2017) (IE11, Opera, Chrome, FireFox, Яндекс):

printStackTrace: function () {
    var err = new Error();
    var stack = err.stack || /*old opera*/ err.stacktrace || ( /*IE11*/ console.trace ? console.trace() : "no stack info");
    return stack;
}

Інші відповіді:

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

не працює в IE 11!

Використання argument.callee.caller - не працює в суворому режимі в жодному браузері!


3

У Google Chrome (версія 19.0 і пізнішої версії) просто викидання виключення працює чудово. Наприклад:

/* file: code.js, line numbers shown */

188: function fa() {
189:    console.log('executing fa...');
190:    fb();
191: }
192:
193: function fb() {
194:    console.log('executing fb...');
195:    fc()
196: }
197:
198: function fc() {
199:    console.log('executing fc...');
200:    throw 'error in fc...'
201: }
202:
203: fa();

покаже слід стека на консолі браузера:

executing fa...                         code.js:189
executing fb...                         code.js:194
executing fc...                         cdoe.js:199
/* this is your stack trace */
Uncaught error in fc...                 code.js:200
    fc                                  code.js:200
    fb                                  code.js:195
    fa                                  code.js:190
    (anonymous function)                code.js:203

Сподіваюся, що це допоможе.


3

функція:

function print_call_stack(err) {
    var stack = err.stack;
    console.error(stack);
}

випадок використання:

     try{
         aaa.bbb;//error throw here
     }
     catch (err){
         print_call_stack(err); 
     }

2
<script type="text/javascript"
src="https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.js"></script>
<script type="text/javascript">
    try {
        // error producing code
    } catch(e) {
        var trace = printStackTrace({e: e});
        alert('Error!\n' + 'Message: ' + e.message + '\nStack trace:\n' + trace.join('\n'));
        // do something else with error
    }
</script>

цей скрипт покаже помилку


2
function stacktrace(){
  return (new Error()).stack.split('\n').reverse().slice(0,-2).reverse().join('\n');
}

2
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як та / або чому він вирішує проблему, покращить довгострокове значення відповіді.
Дональд Дак

1

Вигляд запізнюється на партію, але, ось ще одне рішення, яке автоматично визначає, якщо argument.callee доступний, і використовує новий стек Error (). Якщо ні. Випробуваний на хромі, сафарі та фаєрфоксі.

2 варіанти - stackFN (n) дає вам назву функції n від безпосереднього абонента, а stackArray () дає вам масив, stackArray () [0] - безпосередній абонент.

Спробуйте це на http://jsfiddle.net/qcP9y/6/

// returns the name of the function at caller-N
// stackFN()  = the immediate caller to stackFN
// stackFN(0) = the immediate caller to stackFN
// stackFN(1) = the caller to stackFN's caller
// stackFN(2) = and so on
// eg console.log(stackFN(),JSON.stringify(arguments),"called by",stackFN(1),"returns",retval);
function stackFN(n) {
    var r = n ? n : 0, f = arguments.callee,avail=typeof f === "function",
        s2,s = avail ? false : new Error().stack;
    if (s) {
        var tl=function(x) { s = s.substr(s.indexOf(x) + x.length);},
        tr = function (x) {s = s.substr(0, s.indexOf(x) - x.length);};
        while (r-- >= 0) {
            tl(")");
        }
        tl(" at ");
        tr("(");
        return s;
    } else {
        if (!avail) return null;
        s = "f = arguments.callee"
        while (r>=0) {
            s+=".caller";
            r--;   
        }
        eval(s);
        return f.toString().split("(")[0].trim().split(" ")[1];
    }
}
// same as stackFN() but returns an array so you can work iterate or whatever.
function stackArray() {
    var res=[],f = arguments.callee,avail=typeof f === "function",
        s2,s = avail ? false : new Error().stack;
    if (s) {
        var tl=function(x) { s = s.substr(s.indexOf(x) + x.length);},
        tr = function (x) {s = s.substr(0, s.indexOf(x) - x.length);};
        while (s.indexOf(")")>=0) {
            tl(")");
            s2= ""+s;
            tl(" at ");
            tr("(");
            res.push(s);
            s=""+s2;
        }
    } else {
        if (!avail) return null;
        s = "f = arguments.callee.caller"
        eval(s);
        while (f) {
            res.push(f.toString().split("(")[0].trim().split(" ")[1]);
            s+=".caller";
            eval(s);
        }
    }
    return res;
}


function apple_makes_stuff() {
    var retval = "iPhones";
    var stk = stackArray();

    console.log("function ",stk[0]+"() was called by",stk[1]+"()");
    console.log(stk);
    console.log(stackFN(),JSON.stringify(arguments),"called by",stackFN(1),"returns",retval);
    return retval;
}



function apple_makes (){
    return apple_makes_stuff("really nice stuff");
}

function apple () {
    return apple_makes();
}

   apple();

1

Ви можете використовувати цю бібліотеку http://www.stacktracejs.com/ . Це дуже добре

З документації

Ви також можете передати власну Помилку, щоб отримати стек-трек, недоступний в IE або Safari 5-

<script type="text/javascript" src="https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.js"></script>
<script type="text/javascript">
    try {
        // error producing code
    } catch(e) {
        var trace = printStackTrace({e: e});
        alert('Error!\n' + 'Message: ' + e.message + '\nStack trace:\n' + trace.join('\n'));
        // do something else with error
    }
</script>

Пов'язане джерело https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.js- це стара версія, найновіша стабільна версія (відповідна фрагменту коду) тут:https://raw.githubusercontent.com/stacktracejs/stacktrace.js/stable/stacktrace.js
Фредерік Лейтенбергер

1

Ось відповідь, яка дає вам максимальну продуктивність (IE 6+) та максимальну сумісність. Сумісний з IE 6!

    function stacktrace( log_result ) {
    	var trace_result;
    // IE 6 through 9 compatibility
    // this is NOT an all-around solution because
    // the callee property of arguments is depredicated
    /*@cc_on
    	// theese fancy conditinals make this code only run in IE
    	trace_result = (function st2(fTmp) {
    		// credit to Eugene for this part of the code
    		return !fTmp ? [] :
    			st2(fTmp.caller).concat([fTmp.toString().split('(')[0].substring(9) + '(' + fTmp.arguments.join(',') + ')']);
    	})(arguments.callee.caller);
    	if (log_result) // the ancient way to log to the console
    		Debug.write( trace_result );
    	return trace_result;
    @*/
    	console = console || Console;	// just in case
    	if (!(console && console.trace) || !log_result){
    		// for better performance in IE 10
    		var STerror=new Error();
    		var unformated=(STerror.stack || STerror.stacktrace);
    		trace_result = "\u25BC console.trace" + unformated.substring(unformated.indexOf('\n',unformated.indexOf('\n'))); 
    	} else {
    		// IE 11+ and everyone else compatibility
    		trace_result = console.trace();
    	}
    	if (log_result)
    		console.log( trace_result );
    	
    	return trace_result;
    }
// test code
(function testfunc(){
	document.write( "<pre>" + stacktrace( false ) + "</pre>" );
})();


0

Простіше отримати слід стека на Firefox, ніж на IE, але принципово ось що ви хочете зробити:

Оберніть "проблемний" фрагмент коду в блок "пробування".

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

Якщо ви вивчите вміст об'єкта "помилка", він містить такі поля:

e.fileName: вихідний файл / сторінка, звідки виникла проблема e.lineNumber: номер рядка у файлі / сторінці, де виникла проблема, наприклад, просте повідомлення, що описує тип помилки, наприклад: ім'я: тип помилки, що сталася, у прикладі вище він повинен бути "TypeError" e.stack: Містить стек стека, що спричинив виняток

Я сподіваюся, що це вам допоможе.


1
Неправильно. Він намагається зловити власні винятки. Якщо він кине "asdfg", він отримає рядковий об'єкт, а не об'єкт виключення. Він не намагається спіймати вбудовані винятки.
Іван Вучиця

0

Мені довелося дослідити нескінченну рекурсію в smartgwt з IE11, тому для того, щоб глибше дослідити, мені знадобився слід стека. Проблема полягала в тому, що я не зміг використати консоль розробника, тому що відтворення було складніше таким чином.
Використовуйте наступне у методі javascript:

try{ null.toString(); } catch(e) { alert(e.stack); }

сигнал ((новий помилка ()). стек);
багатий ремер

0

Нічого собі - я не бачу жодної людини за 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

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.