Jika saya melempar sendiri pengecualian JavaScript (mis., throw "AArrggg"
), Bagaimana saya bisa mendapatkan jejak stack (di Firebug atau yang lain)? Saat ini saya baru saja menerima pesannya.
sunting : Seperti banyak orang di bawah ini telah memposting, dimungkinkan untuk mendapatkan jejak stack untuk pengecualian JavaScript tapi saya ingin mendapatkan jejak stack untuk pengecualian saya . Sebagai contoh:
function foo() {
bar(2);
}
function bar(n) {
if (n < 2)
throw "Oh no! 'n' is too small!"
bar(n-1);
}
Ketika foo
disebut, saya ingin mendapatkan setumpuk jejak yang mencakup panggilan ke foo
, bar
, bar
.
javascript
stack-trace
David Wolever
sumber
sumber
throw 'arrrgh';
, dan mereka tampak sama denganthrow new Error('arrrgh');
. Namun, debugger Chrome masih perluthrow new Error('arrrgh');
seperti yang disebutkan (tetapi Chrome tampaknya memberikan jejak yang jauh lebih terperinci).Jawaban:
Edit 2 (2017):
Di semua browser modern, Anda cukup menelepon:
console.trace();
(Referensi MDN)Edit 1 (2013):
Solusi yang lebih baik (dan lebih sederhana) seperti yang ditunjukkan dalam komentar pada pertanyaan asli adalah dengan menggunakan
stack
properti dariError
objek seperti:Ini akan menghasilkan output seperti ini:
Memberi nama fungsi panggilan bersama dengan URL, fungsi panggilannya, dan sebagainya.
Asli (2009):
Versi modifikasi dari potongan ini mungkin dapat membantu:
sumber
caller
sekarang sudah usang dancallee
dihapus dari mode ketat ES5. Inilah mengapa stackoverflow.com/questions/103598/…Perhatikan bahwa chromium / chrome (browser lain yang menggunakan V8), dan juga Firefox memiliki antarmuka yang nyaman untuk mendapatkan stacktrace melalui properti stack pada objek Error .
Ini berlaku untuk pengecualian dasar dan juga untuk yang Anda lemparkan sendiri. (Dianggap bahwa Anda menggunakan kelas Kesalahan, yang merupakan praktik yang baik).
Lihat detail pada dokumentasi V8
sumber
.stack
properti.console.error(e.stack);
sehingga terlihat seperti pesan pengecualian defaultDi Firefox tampaknya Anda tidak perlu membuang pengecualian. Itu cukup untuk dilakukan
sumber
window.onerror
, ini menunjukkan tumpukan yang hampir kosong hanya denganonerror
fungsi.console.log(new Error().stack)
> : (> :(> :(Jika Anda memiliki pembakar, ada opsi break pada semua kesalahan di tab skrip. Setelah skrip mencapai breakpoint Anda, Anda dapat melihat jendela stack firebug:
sumber
Solusi yang baik (dan sederhana) seperti yang ditunjukkan dalam komentar pada pertanyaan asli adalah dengan menggunakan
stack
properti dariError
objek seperti:Ini akan menghasilkan output seperti ini:
Memberi nama fungsi panggilan bersama dengan URL dan nomor baris, fungsi panggilannya, dan sebagainya.
Saya memiliki solusi yang sangat rumit dan cantik yang telah saya buat untuk proyek yang sedang saya kerjakan dan saya telah mengekstrak dan mengerjakannya kembali sedikit untuk digeneralisasi. Ini dia:
Lihat di GitHub (saat ini v1.2)! Anda dapat menggunakannya seperti
Console.debug("Whatever");
dan itu akan, tergantung pada pengaturan dalamConsole
, mencetak output dan jejak tumpukan (atau hanya info sederhana / tidak ada tambahan sama sekali). Ini sebuah contoh:Pastikan untuk bermain-main dengan pengaturan di
Console
objek! Anda dapat menambahkan spasi di antara garis-garis jejak dan mematikannya sepenuhnya. Ini dia denganConsole.trace
set kefalse
:Anda bahkan dapat mematikan bit pertama info ditampilkan (set
Console.settings.debug.showInfo
kefalse
) atau menonaktifkan debugging seluruhnya (setConsole.settings.debug.enabled
kefalse
) sehingga Anda tidak perlu komentar keluar pernyataan debug lagi! Biarkan saja mereka dan ini tidak akan menghasilkan apa-apa.sumber
Saya tidak berpikir ada sesuatu yang dibangun di dalam yang dapat Anda gunakan, tetapi saya menemukan banyak contoh orang menggulung sendiri.
sumber
throw { name: 'NameOfException', message: 'He's dead, Jim' }
.Anda dapat mengakses properti
stack
(stacktrace
dalam Opera) dariError
instance bahkan jika Anda melemparkannya. Masalahnya, Anda harus memastikan Anda menggunakanthrow new Error(string)
(jangan lupa yang baru, bukanthrow string
.Contoh:
sumber
Dengan browser Chrome, Anda dapat menggunakan
console.trace
metode: https://developer.chrome.com/devtools/docs/console-api#consoletraceobjectsumber
Ini akan memberikan jejak stack (sebagai array string) untuk Chrome, Opera, Firefox dan IE10 + modern
Pemakaian:
Itu mengecualikan dari tumpukan panggilannya sendiri serta judul "Kesalahan" yang digunakan oleh Chrome dan Firefox (tetapi bukan IE).
Seharusnya tidak mogok 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 bagi saya itu sangat besar untuk tugas kecil yang dimaksudkan untuk: 37Kb teks yang diperkecil termasuk semua dependensi.
sumber
Pembaruan untuk jawaban Eugene: Objek kesalahan harus dilemparkan agar IE (versi spesifik?) Untuk mengisi
stack
properti. Berikut ini harus bekerja lebih baik daripada contohnya saat ini, dan harus menghindari kembaliundefined
ketika di IE.Catatan 1: Hal semacam ini hanya boleh dilakukan saat debugging, dan dinonaktifkan saat siaran langsung, terutama jika sering dipanggil. Catatan 2: Ini mungkin tidak berfungsi di semua browser, tetapi tampaknya berfungsi di FF dan IE 11, yang sesuai dengan kebutuhan saya.
sumber
salah satu cara untuk mendapatkan jejak stack nyata di Firebug adalah dengan membuat kesalahan nyata seperti memanggil fungsi yang tidak terdefinisi:
Atau gunakan
console.error()
diikuti olehthrow
pernyataan karenaconsole.error()
menunjukkan jejak stack.sumber
Kode polyfill ini berfungsi di browser modern (2017) (IE11, Opera, Chrome, FireFox, Yandex):
Jawaban lain:
tidak bekerja di IE 11!
Menggunakan arguments.callee.caller - tidak bekerja dalam mode ketat di browser apa pun!
sumber
Di Google Chrome (versi 19.0 dan lebih tinggi), cukup melempar pengecualian berfungsi dengan baik. Sebagai contoh:
akan menampilkan jejak stack pada output konsol browser:
Semoga bantuan ini.
sumber
fungsi:
gunakan case:
sumber
skrip ini akan menampilkan kesalahan
sumber
sumber
Agak terlambat ke pesta, tetapi, di sini ada solusi lain, yang secara otomatis mendeteksi jika arguments.callee tersedia, dan menggunakan Kesalahan baru (). Tumpukan jika tidak. Diuji dalam chrome, safari dan firefox.
2 varian - stackFN (n) memberi Anda nama fungsi n dari pemanggil langsung, dan stackArray () memberi Anda sebuah array, stackArray () [0] menjadi pemanggil langsung.
Cobalah di http://jsfiddle.net/qcP9y/6/
sumber
Anda dapat menggunakan perpustakaan ini http://www.stacktracejs.com/ . Ini sangat bagus
Dari dokumentasi
sumber
https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.js
adalah versi lama, versi stabil terbaru (cocok dengan cuplikan-kode) ada di sini:https://raw.githubusercontent.com/stacktracejs/stacktrace.js/stable/stacktrace.js
Berikut ini adalah jawaban yang memberi Anda kinerja maksimal (IE 6+) dan kompatibilitas maks. Kompatibel dengan IE 6!
sumber
Lebih mudah untuk mendapatkan jejak stack di Firefox daripada di IE tetapi pada dasarnya inilah yang ingin Anda lakukan:
Bungkus potongan kode "bermasalah" dalam blok coba / tangkap:
Jika Anda akan memeriksa konten objek "kesalahan" itu berisi bidang-bidang berikut:
e.fileName: File sumber / halaman tempat masalah berasal dari e.lineNumber: Nomor baris dalam file / halaman di mana masalah muncul e.message: Pesan sederhana yang menjelaskan jenis kesalahan apa yang terjadi e.name: Jenisnya kesalahan yang terjadi, pada contoh di atas seharusnya 'TypeError' e.stack: Berisi jejak stack yang menyebabkan pengecualian
Saya harap ini membantu Anda.
sumber
Saya harus menyelidiki rekursi yang tak berujung di smartgwt dengan IE11, jadi untuk menyelidiki lebih dalam, saya perlu jejak stack. Masalahnya adalah, saya tidak dapat menggunakan konsol dev, karena reproduksi lebih sulit.
Gunakan yang berikut ini dalam metode javascript:
sumber
Wow - Saya tidak melihat satu orang pun dalam 6 tahun yang menyarankan agar kami memeriksa dulu untuk melihat apakah
stack
tersedia sebelum menggunakannya! Hal terburuk yang dapat Anda lakukan dalam penangan kesalahan adalah melempar kesalahan karena memanggil sesuatu yang tidak ada.Seperti yang dikatakan orang lain, sementara
stack
sebagian besar aman untuk digunakan sekarang tidak didukung di IE9 atau sebelumnya.Saya mencatat kesalahan yang tidak terduga dan jejak tumpukan sangat penting. Untuk dukungan maksimum, pertama saya periksa untuk melihat apakah
Error.prototype.stack
ada dan merupakan fungsi. Jika demikian maka aman untuk digunakanerror.stack
.Sunting: Tampaknya karena
stack
ini adalah properti dan bukan metode, Anda dapat dengan aman menyebutnya bahkan di peramban yang lebih lama. Saya masih bingung karena saya cukup yakin memeriksaError.prototype
bekerja untuk saya sebelumnya dan sekarang tidak - jadi saya tidak yakin apa yang terjadi.sumber
Menggunakan
console.error(e.stack)
Firefox hanya menunjukkan stacktrace dalam log, Chrome juga menunjukkan pesannya. Ini bisa menjadi kejutan buruk jika pesan itu berisi informasi penting. Selalu login keduanya.sumber
Coba saja
Ini berfungsi cukup baik untuk chrome:
sumber