Bisakah saya menentukan jenis khusus untuk pengecualian yang ditentukan pengguna dalam JavaScript? Jika demikian, bagaimana saya melakukannya?
javascript
exception
Manki
sumber
sumber
Jawaban:
Dari WebReference :
sumber
catch (e) { if (e instanceof TypeError) { … } else { throw e; } }
⦃⦄ ataucatch (e) { switch (e.constructor) { case TypeError: …; break; default: throw e; }
⦃⦄.Anda harus membuat pengecualian khusus yang secara bawaan mewarisi dari Kesalahan. Sebagai contoh:
Ini pada dasarnya adalah versi yang disederhanakan dari apa yang disayangkan diposting di atas dengan perangkat tambahan yang berfungsi melacak jejak pada Firefox dan browser lainnya. Itu memenuhi tes yang sama yang dia posting:
Pemakaian:
Dan itu akan berperilaku diharapkan:
sumber
Anda dapat menerapkan pengecualian Anda sendiri dan penanganannya misalnya seperti di sini:
Ada sintaks lain untuk menangkap pengecualian yang diketik, meskipun ini tidak akan berfungsi di setiap browser (misalnya tidak di IE):
sumber
Iya. Anda dapat melempar apa pun yang Anda inginkan: bilangan bulat, string, objek, apa pun. Jika Anda ingin melempar objek, maka cukup buat objek baru, sama seperti Anda akan membuatnya dalam keadaan lain, lalu melemparkannya. Referensi Javascript Mozilla memiliki beberapa contoh.
sumber
Ini memungkinkan untuk penggunaan seperti ..
sumber
e instanceof Error
itu salah.e instanceof MyError
itu benar,else if(e instanceof Error)
pernyataan itu tidak akan pernah dievaluasi.else if(e instanceof Error)
akan menjadi tangkapan terakhir. Kemungkinan diikuti oleh yang sederhanaelse
(yang tidak saya sertakan). Agak sepertidefault:
dalam pernyataan switch tetapi untuk kesalahan.Pendeknya:
Jika Anda menggunakan ES6 tanpa transpiler :
Lihat Memperluas Kesalahan dalam Javascript dengan sintaksis ES6 untuk mengetahui praktik terbaik saat ini
Jika Anda menggunakan Babel transpiler :
Opsi 1: gunakan babel-plugin-transform-builtin-extended
Opsi 2: lakukan sendiri (terinspirasi dari perpustakaan yang sama)
Jika Anda menggunakan ES5 murni :
Alternatif: gunakan kerangka kerja Classtrophobic
Penjelasan:
Mengapa memperluas kelas Kesalahan menggunakan ES6 dan Babel merupakan masalah?
Karena turunan CustomError tidak lagi dikenali.
Bahkan, dari dokumentasi resmi Babel, Anda tidak dapat memperpanjang built-in kelas JavaScript seperti
Date
,Array
,DOM
atauError
.Masalahnya dijelaskan di sini:
Bagaimana dengan jawaban SO lainnya?
Semua jawaban yang diberikan memperbaiki
instanceof
masalah tetapi Anda kehilangan kesalahan regulerconsole.log
:Sedangkan menggunakan metode yang disebutkan di atas, tidak hanya Anda memperbaiki
instanceof
masalah tetapi Anda juga menyimpan kesalahan rutinconsole.log
:sumber
Di sini adalah bagaimana Anda dapat membuat kesalahan khusus dengan sepenuhnya identik dengan
Error
perilaku asli. Teknik ini hanya berfungsi di Chrome dan node.js untuk saat ini. Saya juga tidak akan merekomendasikan untuk menggunakannya jika Anda tidak mengerti apa fungsinya.Sebagai hasil kita dapatkan
Maka Anda dapat menggunakannya seperti ini:
Dan gunakan
NotImplementedError
seperti yang Anda inginkanError
:Dan itu akan berperilaku diharapkan:
Catatan, itu
error.stack
berfungsi absolut dengan benar dan tidak akan menyertakanNotImplementedError
panggilan konstruktor (terima kasih kepada v8Error.captureStackTrace()
).Catatan. Ada yang jelek
eval()
. Satu-satunya alasan digunakan adalah untuk mendapatkan yang benarerr.constructor.name
. Jika Anda tidak membutuhkannya, Anda dapat sedikit menyederhanakan semuanya.sumber
Error.apply(self, arguments)
adalah ditentukan tidak bekerja . Saya sarankan untuk menyalin jejak stack yang kompatibel dengan cross-browser.Saya sering menggunakan pendekatan dengan pewarisan prototypal. Overriding
toString()
memberi Anda keuntungan bahwa alat-alat seperti Firebug akan mencatat informasi aktual alih-alih[object Object]
ke konsol untuk pengecualian yang tidak tertangkap.Gunakan
instanceof
untuk menentukan jenis pengecualian.main.js
Exception.js
DuplicateIdException.js
sumber
ES6
Dengan kelas baru dan perpanjang kata kunci, sekarang jauh lebih mudah:
sumber
Gunakan pernyataan melempar .
JavaScript tidak peduli apa jenis pengecualiannya (seperti halnya Java). JavaScript hanya pemberitahuan, ada pengecualian dan ketika Anda menangkapnya, Anda bisa "melihat" apa yang dikatakan "pengecualian".
Jika Anda memiliki berbagai jenis pengecualian yang harus Anda buang, saya sarankan untuk menggunakan variabel yang berisi string / objek dari pesan pengecualian yaitu. Di mana Anda membutuhkannya, gunakan "throw myException" dan dalam tangkapan, bandingkan pengecualian yang tertangkap dengan myException.
sumber
Lihat contoh ini di MDN.
Jika Anda perlu mendefinisikan beberapa Kesalahan (uji kodenya di sini !):
Kode sebagian besar disalin dari: Apa cara yang baik untuk memperpanjang Kesalahan dalam JavaScript?
sumber
Alternatif jawaban asselin untuk digunakan dengan kelas ES2015
sumber
Sekarang kita atur menambahkan alasan atau properti apa pun yang kita inginkan ke objek kesalahan dan mengambilnya. Dengan membuat kesalahan lebih masuk akal.
sumber