Sentry-javascript: Secara otomatis mencatat semua kesalahan yang terjadi?

Dibuat pada 10 Feb 2013  ·  31Komentar  ·  Sumber: getsentry/sentry-javascript

Apakah ada cara untuk membuat Raven mencatat semua kesalahan yang terjadi? Untuk beberapa alasan, ini mencatat beberapa panggilan throw tetapi tidak yang lain. Saya menemukan bahwa itu cenderung tidak mencatat perilaku yang bersarang lebih jauh di bawah tumpukan panggilan.

Komentar yang paling membantu

Ini dia:

var __hasProp = {}.hasOwnProperty,
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

window.Error = (function(_super) {

  __extends(_Class, _super);

  function _Class() {
    var error;
    error = _Class.__super__.constructor.apply(this, arguments);
    Raven.captureException(error);
    return error;
  }

  return _Class;

})(Error);

Semua 31 komentar

haha, penanganan kesalahan dalam Javascript benar-benar mengerikan. Bisakah Anda memberi saya contoh bagaimana Anda membuat kesalahan?

Misalnya, melempar string tidak memungkinkan kita mendapatkan informasi apa pun kecuali pesan yang dikirim. Dengan objek Error aktual, kita dapat (berusaha) untuk mendapatkan tumpukan.

Jadi semakin banyak informasi, semakin baik untuk ini.

Memang.

Saya melempar kesalahan seperti ini:

throw new Error("Error");

Kadang-kadang log in penjaga dan kadang-kadang tidak.

Apakah ini di halaman yang bisa saya lihat di suatu tempat? Atau bisakah Anda meletakkannya di suatu tempat? Sejujurnya, itu tidak cukup informasi. Ada sekitar 10 faktor yang dapat menyebabkan kesalahan tidak dicatat, dan sebagian besar di luar kendali kita. :) Jadi jika saya bisa melihat konteks lengkapnya, saya bisa memberi Anda saran untuk membantu browser keluar.

Aplikasi ini sebenarnya ditulis dalam CoffeeScript yang dikompilasi ke JavaScript menggunakan require.js. Titik masuk utama terlihat seperti ini:

Raven.config('http://[email protected]');
Raven.context(function() {
  define(['cs!csmain']);
});

Saya sudah mencoba tanpa pembungkus context juga dan itu sepertinya tidak mengubah apa pun. Itu masih mencatat throw panggilan yang dibuat lebih tinggi di tumpukan panggilan sementara mengabaikan yang di bawah.

Apakah Anda menjalankan Raven.install()

Dan untuk require.js, jika Anda secara eksplisit ingin membungkus modul, Anda harus melakukan:

define(['module'], Raven.wrap(function(module) {
  // insert cool stuff here
}));

Saya lupa di cuplikan, tetapi saya memanggil install() setelah config()

Saya belum mencoba membungkus modul, tetapi saya pikir jika sudah berfungsi di beberapa tempat, mengapa tidak di tempat lain?

Itu semua sangat tergantung pada callstack. Ketika hal-hal mulai masuk ke tanah asinkron, itu menjadi kasar. Misalnya, ini tidak akan berjalan seperti yang diharapkan:

Raven.context(function() {
  setTimeout(function() {
    throw new Error('crap');
  }, 1);
});

Fungsi internal dijalankan dalam konteksnya sendiri di luar konteks utama. Node.js menyelesaikan ini dengan sesuatu yang disebut "domain", tetapi sayangnya, itu tidak ada di browser.

Jadi jika kesalahan tidak diketahui dan menggelembung sampai ke atas, biasanya akan ditolak karena 100% tidak berharga pada saat itu.

Aku mengerti. Mungkin ada cara untuk memanfaatkan window.onerror ?

FWIW, jika memungkinkan, cara paling percaya diri untuk menangkap pengecualian adalah dengan menggunakan Raven.captureException secara eksplisit. Saya mengerti bahwa itu tidak selalu layak, tetapi hanya FYI.

Jadi percobaan eksplisit...kecuali blok adalah yang paling dapat diandalkan:

try {
  throw new Error('something');
} catch(e) {
  Raven.captureException(e);
}

Benar. Tentu saja akan sangat bagus untuk menangkap kesalahan secara otomatis, tetapi JavaScript tidak membuatnya menjadi permainan yang mudah untuk dimainkan...

@pheuter Tidak. :) Dan itulah bagian yang menyenangkan. Setelah kesalahan masuk ke window.onerror, itu bukan lagi objek Error yang sebenarnya. Itu mendatar menjadi hanya string yang tidak berguna. Dan itu juga menimbulkan masalah keamanan lintas domain. Jadi pada dasarnya, sekali kesalahan mencapai window.onerror , biasanya akan dibuang karena satu-satunya informasi yang kita miliki mungkin hanya: "Script error." .

menyebalkan. Oh well, saya menghargai klarifikasi!

Tidak, Javascript tidak. Ini benar-benar mengerikan, sebenarnya. :) Saya secara aktif meneliti dan mengeksplorasi cara untuk mengeksploitasi browser untuk memberi kami informasi yang lebih baik. Ide itu bahkan terlintas di benak saya untuk menambal monyet Function.prototype.call . Tapi itu mungkin benar-benar berita buruk.

Sama sekali! Jika Anda memiliki rekomendasi atau saran untuk memperjelas dokumentasi, beri tahu saya. Saya selalu mencari barang itu.

Akan dilakukan, konfigurasi dan dokumen penggunaan cukup mudah dan mudah diikuti.

Saya ingin tahu apakah ada cara untuk memperpanjang Error agar ini berfungsi.

@mattrobenolt , ini adalah pendekatan yang kami ambil menggunakan CoffeeScript.

window.Error = class extends Error
  constructor: ->
    error = super
    Raven.captureException error
    return error

Kemudian gunakan saja throw new Error "Test Error"

Komentar yang diperbarui di atas untuk klarifikasi.

Hmm. Saya akan bermain dengan ini selama akhir pekan. Terakhir saya mencoba, itu tidak akan membiarkan saya menambal jendela. Kesalahan. Saya akan mencoba lagi di lebih banyak browser dan melihat apa yang mungkin.

Terimakasih atas peringatannya!

Juga, dapatkah Anda memberi saya itu dalam Javascript normal? Saya cukup yakin apa yang dilakukannya, saya hanya ingin memeriksa ulang. Saya tidak menulis Coffeescript.

Ini dia:

var __hasProp = {}.hasOwnProperty,
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

window.Error = (function(_super) {

  __extends(_Class, _super);

  function _Class() {
    var error;
    error = _Class.__super__.constructor.apply(this, arguments);
    Raven.captureException(error);
    return error;
  }

  return _Class;

})(Error);

Sekarang saya memikirkannya, ini adalah pendekatan yang salah. Mengesampingkan konstruktor saja akan menyebabkan Raven menangkap setiap objek kesalahan, apakah itu dilempar atau tidak. :)

FYI, errorception menemukan cara untuk menangani ini. Akan keren jika raven-js bisa melakukan hal yang sama.

@dmcquay Bisakah Anda memberikan contoh yang ditangkap oleh Errorception? Saya mungkin bisa merekayasa baliknya.

Saya benar-benar berasumsi bahwa semua penangan kesalahan JS adalah 50% raven.js ;)

:tinja:

@BYK , ​​ada ide?

Saya tidak memiliki pengetahuan orang dalam tentang errorception. Saya menggunakan layanan ini dan tampaknya berfungsi seperti yang diiklankan. Itu semua yang aku tahu.

Saya memeriksa cara kerjanya dan sepertinya mereka hanya menempelkan diri ke window.onerror dan tidak peduli dengan jejak tumpukan. Setidaknya untuk hal-hal seperti ini.

Membajak objek Kesalahan berfungsi untuk Firefox tetapi poin @mattrobenolt tentang menangkap semuanya, bahkan yang tidak dibuang adalah masalah yang valid.

Solusi kotor untuk ini mungkin menyimpan instance Error yang dibuat dengan membajak konstruktor global dan juga mendengarkan onerror dan membandingkan message , fileName dan lineNo Argumen

Saat mengevaluasi semua layanan pemberitahuan kesalahan, saya perhatikan bahwa beberapa layanan khusus Javascript (seperti https://qbaka.com/) melacak jejak tumpukan dan menampilkan tindakan pengguna yang menyebabkan kesalahan tertentu. Sayang sekali errorception tidak melakukan itu karena tampaknya lebih unggul dalam segala hal.

Kami akan menggunakan Sentry untuk kode Django kami, dan saya menemukan masalah ini saat mencari info tentang cara kerja Sentry untuk Javascript. Apakah implementasi raven-js saat ini memerlukan kode untuk secara eksplisit menangkap semua kesalahan JS dan melaporkannya ke Sentry?

@adityar7 Tidak. Raven.js mencoba yang terbaik untuk menambal monyet dan mencegat sesuatu jika bisa. Dalam beberapa kasus Edge lainnya, Anda mungkin perlu membungkus secara eksplisit, tetapi kami berusaha sangat keras untuk mewujudkannya secara otomatis.

@mattrobenolt Berhasil dengan memperbaiki beberapa sintaks. Terima kasih!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat