Bagaimana cara mengekstrak SEMUA informasi pengecualian asli JavaScript?

Ya, karena JavaScript dijalankan di sisi klien, saya tidak dapat mengontrol banyak variabel lingkungan dan, pada titik tertentu, aplikasi saya mungkin akan mengeluarkan pengecualian.

Apa yang ingin saya lakukan adalah mendapatkan pengecualian ini dan membuat aplikasi saya gagal dengan baik dan menampilkan informasi sebanyak mungkin kepada pengguna akhir (pengguna akhir saya adalah pengguna teknis). Jelasnya, penanganan error dapat dilakukan melalui blok try...catch sederhana.

Yang mengganggu saya adalah: bagaimana saya bisa mengetahui informasi apa yang disimpan dalam pengecualian asli yang ditangkap oleh blok catch?

Saya berasumsi bahwa pengecualian asli yang diberikan oleh mesin JS browser hanyalah objek dari kelas Error, seperti dengan menjalankan kode ini:

try {
  a;
} catch (ex) {
  console.log(ex);
  console.log(new ReferenceError("`Custom` error"));
}

Saya mendapatkan struktur yang sama:

ReferenceError: a is not defined
    at http://stacksnippets.net/js:14:3
ReferenceError: `Custom` error
    at http://stacksnippets.net/js:17:15

Ya, console.log objek normal sedikit berbeda dari ini, tetapi dengan asumsi bahwa variabel ex adalah objek, saya dapat mengulanginya dengan for...in, bukan?

Ya, tidak.

Kode ini tidak menampilkan apa pun di log:

try {
  a;
} catch (ex) {
  for (prop in ex) {
    console.log(prop, ": ", ex[prop]);
  }
}

Jadi, pertanyaan saya adalah: Bagaimana saya bisa menyimpan semua informasi dalam pengecualian JavaScript asli?

Ya, saya tahu bahwa saya dapat mengakses properti secara langsung pada ex.name, ex.description, ex.message, ex.stack, dan seterusnya, namun saya ingin menghindarinya. Beberapa browser dapat mengimplementasikan sesuatu yang tidak dimiliki browser lain, jadi saya akan kehilangan beberapa informasi saat menjalankan browser pertama (seperti yang Anda lihat di pertanyaan ini, properti stack, misalnya, pertama kali diterapkan oleh Firefox).

Dan, jika ada yang bisa menjelaskan, saya ingin memahami apa sifat sebenarnya dari pengecualian JavaScript (apakah itu objek? mengapa mereka terlihat sangat berbeda di konsol?) dan mengapa saya tidak bisa mengulanginya dengan for.. .in blok (mungkin jawabannya sangat terkait).

Terima kasih.


person Dinei    schedule 17.06.2015    source sumber


Jawaban (1)


Saya ingin memahami apa sifat sebenarnya dari pengecualian JavaScript (apakah itu objek? mengapa mereka terlihat sangat berbeda di konsol?)

Pengecualian Javascript adalah objek javascript biasa. Anda dapat melihat definisi objek di sini

dan mengapa saya tidak bisa mengulanginya dengan blok for...in (mungkin jawabannya sangat terkait).

Mengulangi properti kesalahan menggunakan for (prop in ex) { tidak berfungsi karena properti tidak ditandai sebagai enumerable (ini adalah juga ditampilkan dalam cuplikan kode di bawah dengan mencetak deskriptor properti)

Anda dapat beralih menggunakan getOwnPropertyNames untuk membuat daftar semua properti.

Kode di bawah mengilustrasikan bagaimana ini dapat digunakan - tidak yakin apakah boleh menggunakan getOwnPropertyNames & ex[property] dengan cara ini, tetapi ini adalah solusi yang mungkin.

function propsToStr(obj) {
  var str = '';
  for (prop in obj) {
    str += prop + "=" + obj[prop] + ",";
  }
  return str;
}

try {
  a;
} catch (ex) {
  console.log(ex);
  var propertyNames = Object.getOwnPropertyNames(ex);
  propertyNames.forEach(function(property) {
    var descriptor = Object.getOwnPropertyDescriptor(ex, property);
    console.log(property + ":" + ex[property] + ":" + propsToStr(descriptor));
  });
}

person 6ton    schedule 17.06.2015