Come posso ottenere una traccia dello stack JavaScript quando lancio un'eccezione?


519

Se lancio un'eccezione JavaScript (ad esempio, throw "AArrggg"), come posso ottenere la traccia dello stack (in Firebug o in altro modo)? In questo momento ho appena ricevuto il messaggio.

modifica : come molte persone di seguito hanno pubblicato, è possibile ottenere una traccia dello stack per un'eccezione JavaScript, ma voglio ottenere una traccia dello stack per le mie eccezioni. Per esempio:

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

Quando fooviene chiamato, voglio ottenere una traccia dello stack che include le chiamate a foo, bar, bar.



Bug è ancora aperto sul tracker bug di Firebug dal 2008: code.google.com/p/fbug/issues/detail?id=1260 - inizia !
Miller Medeiros

13
La risposta dovrebbe essere "lancia nuovo errore ('arrrgh');" vedi questa pagina ben scritta: devthought.com/2011/12/22/a-string-is-not-an-error
elegant dice

1
(2013) Ora puoi ottenere tracce dello stack in Firebug su Firefox anche se è semplice throw 'arrrgh';e sembrano uguali a quelle di throw new Error('arrrgh');. Il debugger di Chrome ha ancora bisogno di throw new Error('arrrgh');come indicato, tuttavia (ma Chrome sembra dare tracce molto più dettagliate).
user56reinstatemonica8

26
@ChetanSastry Ho cercato su Google 'traccia stack javascript' e questo è stato il primo risultato
David Sykes

Risposte:


756

Modifica 2 (2017):

In tutti i browser moderni puoi semplicemente chiamare: console.trace(); (Riferimenti MDN)

Modifica 1 (2013):

Una soluzione migliore (e più semplice) come sottolineato nei commenti sulla domanda originale è quella di utilizzare la stackproprietà di un Erroroggetto in questo modo:

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

Questo genererà output in questo modo:

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

Dare il nome della funzione chiamante insieme all'URL, alla sua funzione chiamante e così via.

Originale (2009):

Una versione modificata di questo frammento può in qualche modo aiutare:

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
Non sono sicuro del perché questo non sia stato votato di più - le altre risposte non hanno funzionato così bene per me. A proposito, assicurati di non trattare gli argomenti come un array (frammento aggiornato qui: gist.github.com/965603 )
ripper234

1
non funziona in chrome, tacktrace (): [Eccezione: TypeError: Object # <Object> non ha metodo
hetaoblog

3
vedi commento sulla domanda originale: non è necessario il codice personalizzato, basta usare "buttare un nuovo errore ('arrrgh')"
Joshua Richardson,

16
Error.stack non è definito in IE, funziona solo con Chrome e Mozilla Firefox
Philipp Munin,

4
Si noti che callerora è obsoleto e calleeviene rimosso dalla modalità rigorosa ES5. Ecco perché stackoverflow.com/questions/103598/...
philt

187

Si noti che chromium / chrome (altri browser che utilizzano V8) e Firefox hanno un'interfaccia pratica per ottenere una stack stack tramite una proprietà stack su oggetti Error .

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

Si applica per le eccezioni di base e per quelle che ti butti. (Considerato che usi la classe Error, che è comunque una buona pratica).

Vedi i dettagli sulla documentazione V8


12
Firefox supporta anche la .stackproprietà.
kennytm,

2
Vorrei poter votare 100 volte! Grazie Jocelyn. Mi ha davvero aiutato molto
safrazik l'

1
puoi anche usarlo in console.error(e.stack);modo che appaia come un messaggio di eccezione predefinito
Bruno Peres,

80

In Firefox sembra che non sia necessario lanciare l'eccezione. È sufficiente farlo

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

Funziona anche con le app mobili (create usando JQM).
Samik R,

Funziona anche in Chromium (comunque versione 43).
Andy Beverley,

In Firefox 59 questo non funziona quando viene chiamato via window.onerror, mostra uno stack quasi vuoto con solo la onerrorfunzione.
Code4R7,

Ancora meglio, potresti fare: console.log(new Error().stack)> : (> :(> :(
Andrew

25

Se hai firebug, c'è un'interruzione su tutti gli errori nella scheda script. Una volta che lo script ha raggiunto il punto di interruzione, puoi guardare la finestra dello stack di Firebug:

immagine dello schermo


5
Hrm, non sembra funzionare. Mi interrompe in un debugger su errori generati da Javascript (ad esempio, errori variabili non definiti), ma quando lancio le mie eccezioni ancora non ricevo altro che il messaggio "Eccezione non rilevata".
David Wolever,

11

Una buona (e semplice) soluzione, come sottolineato nei commenti sulla domanda originale, è usare la stackproprietà di un Erroroggetto in questo modo:

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

Questo genererà output in questo modo:

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

Dare il nome della funzione chiamante insieme all'URL e al numero di linea, alla sua funzione chiamante e così via.

Ho una soluzione davvero elaborata e carina che ho ideato per un progetto a cui sto attualmente lavorando e l'ho estratto e rielaborato un po 'per essere generalizzato. Ecco qui:

(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);

Dai un'occhiata su GitHub (attualmente v1.2)! Puoi usarlo in modo simile Console.debug("Whatever");e, a seconda delle impostazioni Console, stamperà l'output e una traccia dello stack (o solo semplici informazioni / niente in più). Ecco un esempio:

Console.js

Assicurati di giocare con le impostazioni Consolenell'oggetto! È possibile aggiungere una spaziatura tra le linee della traccia e disattivarla completamente. Eccolo con Console.traceimpostato su false:

Nessuna traccia

Puoi anche disattivare il primo bit di informazioni mostrato (impostato Console.settings.debug.showInfosu false) o disabilitare del tutto il debug (impostato Console.settings.debug.enabledsu false) in modo da non dover più commentare un'istruzione di debug! Lasciateli dentro e questo non farà nulla.


10

Non credo che ci sia qualcosa di incorporato che puoi usare, ma ho trovato molti esempi di persone che fanno il proprio.


Ah, grazie - sembra che il primo link ci possa essere (anche se la mancanza del supporto per la ricorsione può renderlo non realizzabile).
David Wolever,

Sì, non ho visto nulla che supportasse la ricorsione a prima vista. Sarò curioso di vedere se c'è una buona soluzione a questo.
Mark Biek,

1
Penso che il secondo link dovrebbe supportare la ricorsione per Firefox e Opera perché utilizza la traccia dello stack di errori anziché crearne uno manualmente usando la variabile argomenti. Mi piacerebbe sapere se trovi una soluzione cross browser per il problema della ricorsione (il primo articolo è mio). :)
Helephant,

Helephant: Il secondo non funzionerà qui perché, quando prendo l'eccezione, è una "stringa" (cioè, nessun "e.stack"): foo = function () {throw "Arg"; } try {foo (); } catch (e) {/ * typeof e == "string" * /} Forse sto sbagliando? (inizia a parlare obbligatoriamente di quanto siano stupidi i tutorial JavaScript ...)
David Wolever,

Prova a lanciare un oggetto: throw { name: 'NameOfException', message: 'He's dead, Jim' }.
Aaron Digulla,

7

Puoi accedere alle proprietà stack( stacktracein Opera) di Errorun'istanza anche se l'hai lanciata. Il fatto è che devi assicurarti di usare throw new Error(string)(non dimenticare il nuovo invece di throw string.

Esempio:

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

stacktrace non funziona in Opera. Non riesco nemmeno a trovare qualcosa al riguardo.
NVI

@NV: Sembra che stacktrace non abbia errori creati dall'utente, quindi dovresti farlo: prova {0 ++} catch (e) {myStackTrace = e.stack || e.stacktrace}
Eli Gray,


7

Ciò fornirà una traccia dello stack (come array di stringhe) per Chrome, Opera, Firefox e IE10 + moderni

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);
}

Uso:

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

Esclude dallo stack la propria chiamata e il titolo "Errore" utilizzato da Chrome e Firefox (ma non da IE).

Non dovrebbe arrestarsi in modo anomalo su browser meno recenti, ma restituire solo array vuoti. Se hai bisogno di una soluzione più universale, consulta stacktrace.js . Il suo elenco di browser supportati è davvero impressionante ma a mio avviso è molto grande per quel piccolo compito a cui è destinato: 37Kb di testo minimizzato incluse tutte le dipendenze.


7

Un aggiornamento alla risposta di Eugene: l'oggetto errore deve essere lanciato per consentire a IE (versioni specifiche?) Di popolare la stackproprietà. Quanto segue dovrebbe funzionare meglio del suo esempio corrente ed evitare di tornare undefinedin IE.

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

Nota 1: questo genere di cose dovrebbe essere fatto solo durante il debug e disabilitato quando live, specialmente se chiamato frequentemente. Nota 2: Questo potrebbe non funzionare in tutti i browser, ma sembra funzionare in FF e IE 11, che si adatta bene alle mie esigenze.


6

un modo per ottenere una traccia dello stack reale su Firebug è creare un errore reale come chiamare una funzione indefinita:

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);

Oppure utilizzare console.error()seguito da throwun'istruzione poiché console.error()mostra la traccia dello stack.


4

Questo codice polyfill funziona nei browser moderni (2017) (IE11, Opera, Chrome, FireFox, Yandex):

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

Altre risposte:

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

non funziona in IE 11!

Utilizzando argomenti.callee.caller - non funziona in modalità rigorosa in nessun browser!


3

In Google Chrome (versione 19.0 e successive), semplicemente lanciare un'eccezione funziona perfettamente. Per esempio:

/* 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();

mostrerà la traccia dello stack nell'output della console del browser:

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

Spero che questo aiuto.


3

funzione:

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

caso d'uso:

     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>

questo script mostrerà l'errore


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

2
Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
Donald Duck,

1

Un po 'tardi alla festa, ma, ecco un'altra soluzione, che rileva automaticamente se argomenti.callee è disponibile e usa il nuovo Error (). Stack in caso contrario. Testato su Chrome, Safari e Firefox.

2 varianti: stackFN (n) ti dà il nome della funzione n lontano dal chiamante immediato, e stackArray () ti dà un array, stackArray () [0] è il chiamante immediato.

Provalo su 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

È possibile utilizzare questa libreria http://www.stacktracejs.com/ . È molto buono

Dalla documentazione

Puoi anche passare il tuo errore per ottenere uno stacktrace non disponibile in IE o 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>

La fonte collegata https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.jsè una vecchia versione, la più recente versione stabile (corrispondente allo snippet di codice) è qui:https://raw.githubusercontent.com/stacktracejs/stacktrace.js/stable/stacktrace.js
Frederic Leitenberger

1

Ecco una risposta che ti offre le massime prestazioni (IE 6+) e la massima compatibilità. Compatibile con 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

È più facile ottenere una traccia dello stack su Firefox rispetto a IE, ma fondamentalmente ecco cosa vuoi fare:

Avvolgi il pezzo di codice "problematico" in un blocco try / catch:

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

Se esaminerai il contenuto dell'oggetto "errore", esso contiene i seguenti campi:

e.fileName: il file / pagina di origine da cui proviene il problema e.lineNumber: il numero di riga nel file / pagina in cui si è verificato il problema e.message: un semplice messaggio che descrive quale tipo di errore si è verificato e.name: il tipo di errore verificatosi, nell'esempio sopra dovrebbe essere "TypeError" e.stack: contiene la traccia dello stack che ha causato l'eccezione

Spero che questo ti aiuti.


1
Sbagliato. Sta cercando di catturare le SUE eccezioni. Se lancia "asdfg", otterrà un oggetto stringa, non un oggetto eccezione. Non sta cercando di rilevare eccezioni integrate.
Ivan Vučica,

0

Ho dovuto indagare su una ricorsione infinita in smartgwt con IE11, quindi per investigare più a fondo avevo bisogno di una traccia dello stack. Il problema era che non ero in grado di utilizzare la console di sviluppo, perché la riproduzione era più difficile in quel modo.
Utilizzare quanto segue in un metodo javascript:

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

alert ((nuovo errore ()). stack);
rich remer

0

Wow - Non vedo una sola persona da 6 anni a suggerire di controllare prima se stackè disponibile prima di usarlo! La cosa peggiore che puoi fare in un gestore di errori è lanciare un errore a causa della chiamata a qualcosa che non esiste.

Come altri hanno già detto, sebbene stacksia per lo più sicuro da usare ora non è supportato in IE9 o versioni precedenti.

Registro i miei errori imprevisti e una traccia dello stack è piuttosto essenziale. Per il massimo supporto, controllo innanzitutto se Error.prototype.stackesiste ed è una funzione. In tal caso, è sicuro da usare 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)
            {

            }
        };

Modifica: sembra che dato che stackè una proprietà e non un metodo, puoi tranquillamente chiamarlo anche su browser meno recenti. Sono ancora confuso perché ero abbastanza sicuro che il controllo avesse Error.prototypefunzionato per me in precedenza e ora non funziona, quindi non sono sicuro di cosa stia succedendo.


0

Utilizzando console.error(e.stack)Firefox mostra solo lo stacktrace nei registri, Chrome mostra anche il messaggio. Questa può essere una brutta sorpresa se il messaggio contiene informazioni vitali. Registra sempre entrambi.


0

Prova

throw new Error('some error here')

Questo funziona abbastanza bene per Chrome:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.