Saya ingin menulis handler kesalahan umum yang akan menangkap kesalahan kustom yang dilemparkan dengan sengaja pada setiap contoh kode.
Ketika saya throw new Error('sample')
suka dalam kode berikut
try {
throw new Error({'hehe':'haha'});
// throw new Error('hehe');
} catch(e) {
alert(e);
console.log(e);
}
Log menunjukkan di Firefox sebagai Error: [object Object]
dan saya tidak dapat menguraikan objek.
Untuk yang kedua throw
log ditampilkan sebagai:Error: hehe
Sedangkan ketika saya melakukannya
try {
throw ({'hehe':'haha'});
} catch(e) {
alert(e);
console.log(e);
}
konsol ditampilkan sebagai: Object { hehe="haha"}
di mana saya dapat mengakses properti kesalahan.
Apa bedanya?
Apakah perbedaannya seperti yang terlihat dalam kode? Seperti string akan hanya diteruskan sebagai string dan objek sebagai objek tetapi sintaks akan berbeda?
Saya belum menjelajahi objek melempar kesalahan ... Saya hanya melakukan melempar string.
Apakah ada cara lain selain dua metode yang disebutkan di atas?
sumber
Error
sJawaban:
Berikut adalah penjelasan yang baik tentang objek Kesalahan dan melemparkan kesalahan Anda sendiri
Objek Kesalahan
Apa yang bisa kita ekstrak darinya jika terjadi kesalahan? Objek Galat di semua browser mendukung dua properti berikut:
nama: Nama kesalahan, atau lebih khusus, nama fungsi konstruktor milik kesalahan.
pesan: Deskripsi kesalahan, dengan deskripsi ini bervariasi tergantung pada browser.
Enam nilai yang mungkin dapat dikembalikan oleh properti nama, yang sebagaimana disebutkan sesuai dengan nama-nama konstruktor kesalahan. Mereka:
Melempar kesalahan Anda sendiri (pengecualian)
Alih-alih menunggu salah satu dari 6 jenis kesalahan terjadi sebelum kontrol secara otomatis ditransfer dari blok coba ke blok tangkap, Anda juga dapat secara eksplisit melempar pengecualian Anda sendiri untuk memaksa itu terjadi atas permintaan. Ini bagus untuk membuat definisi Anda sendiri tentang apa kesalahan itu dan kapan kontrol harus ditransfer untuk menangkap.
sumber
Error
(dan subclass) digunakan oleh konvensi. Mereka juga secara default menyediakan properti stack, meskipun itu bisa secara manual ditambahkan ke yang lain. Jadi kebanyakan konvensi, aliran program tidak terpengaruh oleh apa yang Anda lemparkan, hanya saja Anda yangthrow
terpenting. Anda bisathrow "grandmother down the stairs";
dan itu akan bekerja sama, kecuali bahwa tidak akan ada jejak stack terlampir dan fungsi penanganan kesalahan, reporter, debuggers harapkanError
, atau properti yang menyertainya, lebih tepatnya.lempar "I'm Evil"
throw
akan mengakhiri eksekusi lebih lanjut & mengekspos string pesan pada catch the error.Konsol setelah lemparan tidak akan pernah tercapai karena penghentian.
throw new Error ("Aku sangat manis")
throw new Error
memperlihatkan peristiwa kesalahan dengan dua nama params & pesan . Ini juga menghentikan eksekusi lebih lanjutsumber
Error
, oke, di mana koneksi ke komentar? Separuh orang yang berkomentar dan menjawab pertanyaan OP seharusnya tetap diam.Used as a function
dari tautan ini ... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Artikel berikut mungkin masuk ke beberapa lebih detail untuk yang merupakan pilihan yang lebih baik;
throw 'An error'
atauthrow new Error('An error')
:http://www.nczonline.net/blog/2009/03/10/the-art-of-throwing-javascript-errors-part-2/
Ini menunjukkan bahwa yang terakhir (
new Error()
) lebih dapat diandalkan, karena browser seperti Internet Explorer dan Safari (tidak yakin versi) tidak benar melaporkan pesan saat menggunakan yang pertama.sumber
Anda pertama kali menyebutkan kode ini:
dan kemudian dalam contoh pertama Anda, Anda menulis:
Objek Kesalahan pertama benar-benar akan berfungsi, karena mengharapkan nilai string, dalam hal ini 'sampel'. Yang kedua tidak akan karena Anda mencoba untuk melewati objek, dan itu mengharapkan string.
Objek kesalahan akan memiliki properti "pesan", yang akan menjadi 'sampel'.
sumber
toString()
metode pada objek yang dilewatkan, menghasilkan[object Object]
kesalahan (seperti Op menulis).TLDR: mereka setara.
sumber: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error
sumber
Anda bisa
throw
sebagai objeklalu misalnya di
try/catch
atau hanya melempar kesalahan string
sumber
The
Error
konstruktor digunakan untuk membuat suatu objek error. Objek kesalahan dilemparkan ketika terjadi kesalahan runtime. Objek Kesalahan juga dapat digunakan sebagai objek dasar untuk pengecualian yang ditentukan pengguna.Kesalahan yang Ditentukan Pengguna dilemparkan melalui
throw
pernyataan. kontrol program akan diteruskan kecatch
blok pertama di tumpukan panggilan.Perbedaan antara melempar kesalahan dengan dan tanpa objek Kesalahan:
Dalam chrome devtools terlihat seperti ini:
Chrome memberi tahu kami bahwa kami memiliki kesalahan yang tidak tertangkap yang hanya merupakan objek JS. Objek itu sendiri dapat memiliki informasi mengenai kesalahan tersebut tetapi kami masih belum tahu dari mana asalnya. Tidak terlalu berguna ketika kita mengerjakan kode kita dan men-debug-nya.
Dalam chrome devtools terlihat seperti ini:
Kesalahan yang dilempar dengan objek Kesalahan memberi kami jejak stack saat kami memperluasnya. Ini memberi kami informasi berharga dari mana kesalahan itu berasal tepatnya yang seringkali merupakan informasi berharga ketika men-debug kode Anda. Perhatikan lebih lanjut bahwa kesalahan mengatakan
[object Object]
, ini karenaError
konstruktor mengharapkan string pesan sebagai argumen pertama. Ketika menerima objek, ia akan memaksanya menjadi string.sumber
Bereaksi perilaku
Terlepas dari sisa jawaban, saya ingin menunjukkan satu perbedaan dalam Bereaksi.
Jika saya melempar
new Error()
dan saya dalam mode pengembangan, saya akan mendapatkan layar kesalahan dan log konsol. Jika saya melempar string literal, saya hanya akan melihatnya di konsol dan mungkin melewatkannya, jika saya tidak menonton log konsol.Contoh
Melemparkan kesalahan log ke konsol dan menunjukkan layar kesalahan saat dalam mode pengembangan (layar tidak akan terlihat dalam produksi).
Sedangkan kode berikut hanya masuk ke konsol:
sumber