Menangkap semua pengecualian javascript yang tidak tertangani

112

Saya mencoba mencari atau mencari cara untuk menampilkan di kotak peringatan semua pengecualian javascript yang tidak tertangani dalam aplikasi. Saya ingin semua ini dilakukan di sisi klien, tanpa menggunakan kode sisi server apa pun. Saya menggunakan MVC3 sebagai lingkungan.

Saya telah meneliti selama beberapa hari terakhir dan belum menemukan apa yang saya cari.

Saya menemukan 2 cara di bawah ini yang sepertinya hampir seperti yang saya cari, kecuali cara-cara ini diatur sehingga Anda harus meneruskan nama fungsi ke dalam metode kustom untuk mencetak jejak tumpukan semua pengecualian yang tidak tertangani di dalamnya fungsi spesifik. Saya mencari cara agar tidak perlu secara manual mengirimkan nama fungsi ke metode kustom yang mencetak jejak tumpukan semua pengecualian yang tidak tertangani. Saya ingin metode kustom ini hanya 'mendengarkan' untuk semua pengecualian yang tidak tertangani dalam seluruh aplikasi.

http://eriwen.com/javascript/js-stack-trace/

Juga sesuatu yang mirip dengan tautan sebelumnya:

https://github.com/eriwen/javascript-stacktrace

Berikut kode dasar dari tautan ke-2 di atas yang mencetak jejak tumpukan dari fungsi javascript yang ditentukan:

instrumentFunction: function (context, functionName, callback) {
    context = context || window;
    var original = context[functionName];
    context[functionName] = function instrumented() {
        callback.call(this, printStackTrace().slice(4));
        return context[functionName]._instrumented.apply(this, arguments);
    };
    context[functionName]._instrumented = original;
}

function printStackTrace(options) {
    options = options || {
        guess: true
    };
    var ex = options.e || null,
        guess = !! options.guess;
    var p = new printStackTrace.implementation(),
        result = p.run(ex);
    return (guess) ? p.guessAnonymousFunctions(result) : result;
}

Jadi, untuk meringkasnya, apakah Anda semua tahu cara untuk memiliki semacam 'pendengar' untuk mendengarkan semua pengecualian javascript yang tidak tertangani dan kemudian mencetaknya ke layar dalam kotak peringatan?

Terima kasih! Jason

jre247
sumber
satu hal ... apa kamu akan menggunakan kotak peringatan?!? Anda dapat menggunakan console.log (error_message) ke ....
Mathlight
1
Saya pikir pertanyaan Menangkap semua kesalahan JS ini akan membantu Anda
Pilgerstorfer Franz
Anda mungkin harus melihat pertanyaan ini: stackoverflow.com/questions/205688/…
Tandai

Jawaban:

129

Anda dapat melakukan ini dengan menggunakan metode window.onerror.

window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
    alert("Error occured: " + errorMsg);//or any message
    return false;
}
Nish
sumber
13
Jauh lebih baik daripada mencoba membungkus seluruh aplikasi saya dalam blok coba / tangkap. :) Terima kasih!
Anthony
15
Sekadar pemberitahuan: "Perhatikan bahwa beberapa / banyak peristiwa kesalahan tidak memicu window.onerror, Anda harus mendengarkannya secara khusus." - developer.mozilla.org/en-US/docs/Web/API/…
shusson
6
tidak perlu menyertakan nama fungsi (myErrorHandler) dalam kode itu ... hanya bisa menjadi fungsi (errorMsg, url, lineNumber)
JoelFan
18
@JoelFan lebih baik memiliki nama fungsi, untuk keperluan debugging. Debugger akan menggunakan nama fungsi alih-alih ditampilkan sebagai fungsi anonim.
Jerinaw
Ini luar biasa dan terima kasih! telah mencoba men-debug skrip pembesaran foto kompleks yang berfungsi dengan baik 100% sepanjang waktu, kecuali pada safai seluler yang gagal secara acak, dan jika tidak ada jendela "konsol" atau "pengembang" untuk melihat apa yang terjadi. Tentu saya memiliki jendela "debug" sendiri yang dapat saya aktifkan dengan tombol rahasia, tetapi saya tidak memiliki cara untuk melihat secara global setiap kesalahan yang belum saya lakukan 'coba / tangkap. Penambahan ini menunjukkan kepada saya PERSIS di mana masalahnya, dan menyelamatkan lebih banyak rambut saya! Seandainya saya bisa memilih ini dua kali!
Randy
48

Anda dapat menggunakan window.onerror, atau (luar biasa!) Mengikat ke acara 'kesalahan' dengan benar:

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

Jika Anda ingin melacak kesalahan JavaScript, Anda dapat mencoba Atatus . Saya bekerja di Atatus.

Fizer Khan
sumber
7
mengapa Anda "mengembalikan salah"?
kumaresan_sd
@kumaresan_sd memungkinkan pengendali kejadian default untuk diaktifkan: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Jens Bodal
29

Sebagai tambahannya

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

Anda juga bisa menangkap semua error yang diaktifkan di dalam promise callback ( .then()) yang mendengarkan unhandledrejectionperistiwa

window.addEventListener('unhandledrejection', function (e) {
  alert("Error occurred: " + e.reason.message);
})
Javier Perez
sumber
1
Apakah perlu menggunakan keduanya window.onerrordan window.addEventListener("error", atau apakah menggunakan salah satunya sudah cukup?
Tormod Haugene
2
Anda bisa menggunakan salah satunya. Jika Anda menggunakan window.addEventListener("error", kirim useCapturedisetel ke trueuntuk menangkap juga kesalahan elemen yang tidak meluap. developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Javier Perez
1
Terima kasih!! The erroracara tidak menangkap kesalahan tertentu saya. unhandledrejectionmengerti.
joe
throw new Error('tja');tidak terjebak dalam chrome terbaru dengan pendekatan ini ...
OZZIE
1
@JavierPerez Saya menguji menggunakan v80 menyesuaikan acara dan melemparkan kesalahan langsung setelahnya dan tidak tertangkap, juga tidak menangkap kesalahan sintaks.
OZZIE
1

Lihat http://log4javascript.org yang didasarkan pada Log4J. Jika sebagian besar kode Anda dibungkus dalam pernyataan coba / tangkap untuk menangani pengecualian, Anda dapat menggunakan pustaka ini sebagai antarmuka umum untuk mengirim keluaran ke "kotak dialog" yang selalu tersedia atau jendela pencatatan yang dapat dilihat oleh pengguna akhir Anda. Anda bahkan dapat memiliki tombol yang menjalankan window.print () untuk mencetak konten kotak dialog ke printer atau PDF. Semoga berhasil.

Robert Bolton
sumber