Sentry-javascript: Properti pesan kesalahan dicatat sebagai [objek ErrorEvent]

Dibuat pada 7 Agu 2017  ·  31Komentar  ·  Sumber: getsentry/sentry-javascript

Apakah Anda ingin meminta fitur atau melaporkan bug ?
Bug.

Bagaimana perilaku saat ini?
Terkadang (tidak selalu) properti message kesalahan dicatat sebagai [object ErrorEvent] . Saya mengikuti implementasi standar Raven in Angular seperti yang dijelaskan di sini: https://docs.sentry.io/clients/javascript/integrations/angular/.

Apa perilaku yang diharapkan?
Untuk melihat pesan kesalahan normal.

Raven 3.17.0.0
Sudut 4.3.1
Pembuatan webpack
Tidak menggunakan CLI
Versi CDN

objecterrorevent

Help Wanted Needs Reproduction Bug

Komentar yang paling membantu

Saya menemukan masalahnya. ErrorEvent tidak diperlakukan sebagai kesalahan oleh fungsi isError util, yang dapat ditemukan di sini . Untuk kenyamanan, saya juga akan menempelkan definisi fungsi:

function isError(value) {
  switch ({}.toString.call(value)) {
    case '[object Error]':
      return true;
    case '[object Exception]':
      return true;
    case '[object DOMException]':
      return true;
    default:
      return value instanceof Error;
  }
}

Saya melakukan tes cepat di konsol saya untuk melihat apakah fungsi ini akan mengembalikan true untuk ErrorEvent , dan ternyata tidak:

image

isError digunakan dalam metode captureException untuk menentukan apakah parameter pengecualian adalah kesalahan atau hanya pesan. captureException akan mengirimkan pengecualian ke dasbor menggunakan captureMessage jika dianggap _actually_ pengecualian tersebut merupakan kesalahan. Dalam kasus ini, Raven tidak akan menghitung pelacakan tumpukan atau "memproses" pengecualian. Itu hanya mengirimkannya apa adanya.

Adakah alasan mengapa kita tidak memperbarui isError untuk mengembalikan true untuk ErrorEvent objek?

Semua 31 komentar

Apakah ada definisi ErrorEvent di suatu tempat di dokumen Angular? Rupanya ini tidak "mewarisi" Error dengan cara yang benar.

Masalahnya mungkin ada di metode TraceKit traceKitWindowOnError() , tampaknya tidak memperhitungkan bahwa argumen message bisa jadi ErrorEvent (lihat dokumen MDN )

@benvinegar Ada beberapa dokumen di sini tentang ErrorEvent : https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent

Dipengaruhi oleh ini juga, begitu pula pengguna ini:
https://forum.sentry.io/t/reporting-object-errorevent/1807

[email protected] (tetapi telah terjadi pada versi lama juga)
Sudut 4.x
Menggunakan CLI

Sama di sini dengan Ionic 3 dan [email protected]

<script>
  undefined.foo();
</script>

^ Ini di html Anda login di safari melalui penjaga sebagai [object ErrorEvent] . Pesan yang benar adalah TypeError: undefined is not an object (evaluating 'undefined.foo') .

Kami memiliki skrip eksternal yang memasukkan kode melalui tag skrip yang mencoba membuat iframe, tapi itu diblokir oleh safari. Karena kesalahan berasal dari tag skrip yang dimasukkan, penjaga hanya melaporkan [object ErrorEvent]

Kesalahan lain dari penjaga dilaporkan karena hanya [object Event] berasal dari flowplayer. Flowplayer melakukannya

jQueryElement.trigger('error', [api, {code: 5}]);

Anda dapat mereproduksinya dengan menyematkan jQuery dan lakukan saja:

$('div:first').trigger('error')

Sentry melihat sesuatu seperti ini
image

Tentu itu tidak terlalu dapat diserialkan, tetapi kesalahan seperti error on element from jQuery - context <div class="foo><div class="bar" ... akan jauh lebih membantu daripada [object Event]

Juga terpengaruh oleh ini.

@daangeerdink @jdelaune @rosslavery @tgensol dapatkah seseorang memberikan kode sekecil mungkin yang dapat membantu saya mereproduksi ini?

@sod Saya baru saja memeriksa, dan Safari 10.1.2 memberikan pesan yang benar dalam skenario yang Anda sebutkan di atas.

screen shot 2017-09-18 at 14 42 47

Saya pribadi tidak dapat memberikan repro, karena kesalahannya begitu buram sehingga saya tidak dapat membedakan bagian mana dari basis kode saya yang menyebabkan kesalahan. Saya tidak memiliki pelacakan tumpukan untuk dikerjakan, atau pesan kesalahan untuk mencari tahu apakah itu kode saya, atau lib pihak ketiga, dll.

Mudah-mudahan orang lain memiliki contoh sederhana yang dapat mereka berikan, maaf saya tidak bisa lebih membantu.

Kami juga mengalami masalah ini. Saya telah dapat membagikan beberapa data dari 10 hari terakhir (22k ​​peristiwa jenis ini, 13k pengguna). Saya harap ini membantu Anda mereproduksinya.
image

image

image

@kamilogorek Kami memiliki 2 juta kesalahan jenis ini. Saya pikir itu masalah kami, tetapi kami tidak dapat melacaknya dengan benar.

Saya menemukan masalahnya. ErrorEvent tidak diperlakukan sebagai kesalahan oleh fungsi isError util, yang dapat ditemukan di sini . Untuk kenyamanan, saya juga akan menempelkan definisi fungsi:

function isError(value) {
  switch ({}.toString.call(value)) {
    case '[object Error]':
      return true;
    case '[object Exception]':
      return true;
    case '[object DOMException]':
      return true;
    default:
      return value instanceof Error;
  }
}

Saya melakukan tes cepat di konsol saya untuk melihat apakah fungsi ini akan mengembalikan true untuk ErrorEvent , dan ternyata tidak:

image

isError digunakan dalam metode captureException untuk menentukan apakah parameter pengecualian adalah kesalahan atau hanya pesan. captureException akan mengirimkan pengecualian ke dasbor menggunakan captureMessage jika dianggap _actually_ pengecualian tersebut merupakan kesalahan. Dalam kasus ini, Raven tidak akan menghitung pelacakan tumpukan atau "memproses" pengecualian. Itu hanya mengirimkannya apa adanya.

Adakah alasan mengapa kita tidak memperbarui isError untuk mengembalikan true untuk ErrorEvent objek?

Apakah ada alasan mengapa kita tidak memperbarui isError agar mengembalikan nilai true untuk objek ErrorEvent?

Iya. Karena ini sebenarnya bukan turunan dari Error (itu turunan dari Event ). Itu tidak memiliki properti stack , misalnya (AFAICT, bermain-main di konsol). Artinya, mungkin tidak diproses dengan benar.

Akan sangat bagus untuk melihat contoh bagaimana kesalahan ini dihasilkan secara langsung, sehingga kami dapat mengetahui cara terbaik untuk memprosesnya.

Konstruktor untuk ErrorEvent membutuhkan Error , jadi Anda dapat dengan mudah menanganinya seperti ini:

if (isErrorEvent(ex)) {
    ex = ex.error;
}

Anda dapat melihat definisi konstruksi di sini . Secara khusus, lihat hash ErrorEventInit . Ini adalah parameter opsional, jadi saya kira solusi yang saya posting di atas tidak menangani kasus di mana ErrorEvent.error tidak ditentukan.

Tentu, saya yakin ini bisa diselesaikan - saya hanya bermaksud bahwa ini tidak sesederhana hanya menambah isError untuk mengembalikan true .

Saya mengerti. Saya akan memasang PR dalam beberapa menit.

Diperbaiki di 3.19.x

Terima kasih @shcallaway! 👍

Sepertinya kita masih mendapatkan masalah ini di 3.19.1 🤔
image
image

@PhilippSpo dari browser mana acara ini berasal? ErrorEvent tidak didukung di beberapa browser seluler lama dan IE, jadi kami harus beralih ke solusi biasa.

@kamilogorek Chrome 61.0.3163

Saya juga melihatnya di Chrome 61. 😕 Saya akan mencoba untuk segera memeriksanya.

Terima kasih @shcallaway

Juga terjadi di Safari 11.0, Mac OS 10.13

Sepertinya traceKitWindowOnError tidak memproses parameter masukan dengan benar jika parameter 'message' adalah objek ErrorEvent:
screen shot 2017-11-06 at 11 36 34
dan 'mantan' tidak ditentukan. Kemudian, ini memanggil notifyHandlers dengan objek di mana bidang 'message' adalah ErrorEvent, bukan string:
screen shot 2017-11-06 at 11 41 14
yang, jika distrigifikasi di _makeRequest , menghasilkan pesan yang tidak berarti.

Terima kasih atas penyelidikannya @ michal-rumanek, saya akan segera mencoba menangani masalah ini (minggu ini tidak ada waktu luang).

@kamilogorek , ada kemajuan? ;-)

Hai, Saya mendapatkan banyak kesalahan ini [object Object] .
screenshot 2017-12-01 09 41 20

Sudut 4
Chrome 62.0.3202
Raven-js 3.20.1

Apakah halaman ini membantu?
0 / 5 - 0 peringkat