Risposte:
Non sono sicuro di Firefox, ma in v8 / chrome puoi utilizzare un metodo sul costruttore Error chiamato captureStackTrace
. ( Maggiori informazioni qui )
Quindi un modo hacky per ottenerlo sarebbe:
var getStackTrace = function() {
var obj = {};
Error.captureStackTrace(obj, getStackTrace);
return obj.stack;
};
console.log(getStackTrace());
Normalmente, getStackTrace
sarebbe in pila quando viene catturato. Il secondo argomento esclude getStackTrace
dall'essere incluso nella traccia dello stack.
Error().stack
. Sebbene i nomi degli oggetti e delle funzioni vengano persi in Firefox e il nome dell'oggetto venga perso in Chrome (lo stesso di Error.captureStackTrace
), Error().stack
funziona con entrambi i browser e mi fornisce informazioni sufficienti per eseguire il debug.
Error.stack è ciò di cui hai bisogno. Funziona in Chrome e Firefox. Per esempio
try { var a = {}; a.debug(); } catch(ex) {console.log(ex.stack)}
darà in Chrome:
TypeError: Object #<Object> has no method 'debug'
at eval at <anonymous> (unknown source)
at eval (native)
at Object._evaluateOn (unknown source)
at Object._evaluateAndWrap (unknown source)
at Object.evaluate (unknown source)
e in Firefox:
@http://www.google.com.ua/:87 _firebugInjectedEvaluate("with(_FirebugCommandLine){try { var a = {}; a.debug() } catch(ex) {console.log(ex.stack)}\n};")
@http://www.google.com.ua/:87 _firebugEvalEvent([object Event])
@http://www.google.com.ua/:67
(new Error).stack
Questo darà una traccia dello stack (come array di stringhe) per i moderni Chrome, Firefox, Opera e 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);
}
Utilizzo:
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 bloccarsi sui browser meno recenti, ma restituire semplicemente un array vuoto. Se hai bisogno di una soluzione più universale, guarda 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 comprese tutte le dipendenze.
C'è una libreria chiamata stacktrace.js che ti fornisce tracce dello stack cross browser. Puoi usarlo semplicemente includendo lo script e chiamando in qualsiasi momento:
var trace = printStackTrace();
Questo è solo un piccolo miglioramento dell'eccellente codice di Konstantin. Taglia un po 'a scapito del lancio-cattura e istanzia semplicemente lo stack di errori:
function getStackTrace () {
let stack = new Error().stack || '';
stack = stack.split('\n').map(function (line) { return line.trim(); });
return stack.splice(stack[0] == 'Error' ? 2 : 1);
}
Di solito voglio un livello specifico di traccia dello stack (per il mio logger personalizzato), quindi questo è possibile anche quando chiamo:
getStackTrace()[2]; // get stack trace info 2 levels-deep
hai solo bisogno var stack = new Error().stack
. questa è la versione semplificata della risposta @sgouros.
function foo() {
bar();
}
function bar() {
baz();
}
function baz() {
console.log(new Error().stack);
}
foo();
Probabilmente non funzionerà in tutti i browser (funziona in Chrome).