Jawaban:
Saya tidak yakin tentang firefox, tetapi di v8 / chrome Anda dapat menggunakan metode pada konstruktor Kesalahan yang disebut captureStackTrace
. ( Info selengkapnya di sini )
Jadi cara hacky untuk mendapatkannya adalah:
var getStackTrace = function() {
var obj = {};
Error.captureStackTrace(obj, getStackTrace);
return obj.stack;
};
console.log(getStackTrace());
Biasanya, getStackTrace
akan ada di tumpukan saat ditangkap. Argumen kedua di sana tidak getStackTrace
disertakan dalam pelacakan tumpukan.
Error().stack
. Meskipun nama Objek dan fungsi hilang di firefox dan nama objek hilang di chrome (sama seperti Error.captureStackTrace
), Error().stack
berfungsi di kedua browser dan memberi saya informasi yang cukup untuk men-debug.
Error.stack adalah yang Anda butuhkan. Ini berfungsi di Chrome dan Firefox. Sebagai contoh
try { var a = {}; a.debug(); } catch(ex) {console.log(ex.stack)}
akan memberikan di 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)
dan di 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
Ini akan memberikan jejak tumpukan (sebagai array string) untuk Chrome modern, Firefox, Opera dan 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);
}
Pemakaian:
console.log(getStackTrace().join('\n'));
Ini mengecualikan dari tumpukan panggilannya sendiri serta judul "Kesalahan" yang digunakan oleh Chrome dan Firefox (tetapi bukan IE).
Seharusnya tidak macet di browser lama tetapi hanya mengembalikan array kosong. Jika Anda membutuhkan solusi yang lebih universal, lihat stacktrace.js . Daftar browser yang didukungnya benar-benar mengesankan tetapi menurut saya ini sangat besar untuk tugas kecil yang dimaksudkan untuk: 37Kb teks yang diperkecil termasuk semua dependensi.
Ada pustaka bernama stacktrace.js yang memberi Anda pelacakan tumpukan lintas browser. Anda dapat menggunakannya hanya dengan memasukkan skrip dan memanggil kapan saja:
var trace = printStackTrace();
Ini hanya peningkatan kecil pada kode Konstantin yang sangat baik. Ini memotong sedikit biaya melempar-menangkap dan hanya membuat contoh tumpukan Kesalahan:
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);
}
Saya biasanya menginginkan tingkat pelacakan tumpukan tertentu (untuk logger khusus saya) jadi ini juga dapat dilakukan saat memanggil:
getStackTrace()[2]; // get stack trace info 2 levels-deep
kamu hanya butuh var stack = new Error().stack
. ini adalah versi sederhana dari jawaban @sgouros.
function foo() {
bar();
}
function bar() {
baz();
}
function baz() {
console.log(new Error().stack);
}
foo();
Mungkin tidak akan berfungsi di setiap browser (berfungsi di Chrome).