Khususnya, ada situasi di mana kami mungkin ingin menghentikan program atau memberi tahu pengguna jika sesuatu yang buruk terjadi Show
Misalnya
Dalam semua kasus ini kita sebagai pemrogram, membuat kesalahan, atau kita membiarkan mesin pemrograman membuat beberapa untuk kita Setelah membuat kesalahan, kami dapat memberi tahu pengguna dengan pesan, atau kami dapat menghentikan eksekusi sama sekali Apa itu kesalahan dalam JavaScript?Kesalahan dalam JavaScript adalah objek, yang kemudian dilempar untuk menghentikan program Untuk membuat kesalahan baru dalam JavaScript, kami memanggil fungsi konstruktor yang sesuai. Misalnya, untuk membuat kesalahan umum baru yang bisa kita lakukan
Saat membuat objek kesalahan, Anda juga dapat menghilangkan kata kunci 5
Setelah dibuat, objek kesalahan menampilkan tiga properti
Misalnya, jika kita membuat objek _9 baru dengan pesan yang sesuai, 6 akan membawa string kesalahan yang sebenarnya, sementara 7 akan menjadi 2
Firefox juga menerapkan banyak properti non-standar seperti 3, 4, dan 5Banyak jenis kesalahan dalam JavaScriptAda banyak jenis kesalahan dalam JavaScript, yaitu
Ingat, semua jenis kesalahan ini adalah fungsi konstruktor aktual yang dimaksudkan untuk mengembalikan objek kesalahan baru Dalam kode Anda, Anda kebanyakan akan menggunakan 6 dan 9, dua jenis yang paling umum, untuk membuat objek kesalahan Anda sendiriSebagian besar kesalahan akan datang langsung dari mesin JavaScript, seperti 8 atau 01Contoh _9 terjadi saat Anda mencoba untuk menetapkan kembali 09
Contoh 01 adalah saat Anda salah mengeja kata kunci bahasa
Atau saat Anda menggunakan kata kunci yang dicadangkan di tempat yang salah, seperti 11 di luar fungsi 12
Contoh lain dari 9 terjadi saat kita memilih elemen HTML yang tidak ada di halaman
Selain objek kesalahan tradisional ini, objek 14 akan segera mendarat di JavaScript. 14 nyaman untuk menggabungkan banyak kesalahan, seperti yang akan kita lihat nantiSelain kesalahan bawaan ini, di browser kita juga bisa menemukan
16 adalah keluarga kesalahan yang terkait dengan API Web. Mereka terlempar saat kita melakukan hal-hal konyol di browser, seperti
Hasil _Untuk daftar lengkap lihat halaman ini di MDN Apa itu pengecualian?Sebagian besar pengembang berpikir bahwa kesalahan dan pengecualian adalah hal yang sama. Pada kenyataannya, objek kesalahan menjadi pengecualian hanya saat dilempar Untuk membuang pengecualian dalam JavaScript, kami menggunakan 19, diikuti oleh objek kesalahan _Bentuk singkatnya lebih umum, di sebagian besar basis kode yang akan Anda temukan 0atau 1Tidak mungkin membuang pengecualian di luar fungsi atau blok bersyarat. Sebagai gantinya, pertimbangkan contoh berikut 2Di sini kita memeriksa apakah argumen fungsi adalah string. Jika tidak, kami memberikan pengecualian Secara teknis, Anda bisa memasukkan apa saja ke dalam JavaScript, tidak hanya objek kesalahan _3Namun, lebih baik hindari hal-hal tersebut. selalu membuang objek kesalahan yang tepat, bukan primitif Dengan melakukan itu, Anda menjaga konsistensi penanganan kesalahan melalui basis kode. Anggota tim lain selalu dapat berharap untuk mengakses 20 atau 21 pada objek kesalahanApa yang terjadi saat kita melempar pengecualian?Pengecualian seperti lift naik. setelah Anda melempar satu, itu menggelembung di tumpukan program, kecuali jika tertangkap di suatu tempat Pertimbangkan kode berikut _4Jika Anda menjalankan kode ini di browser atau di Node. js, program berhenti dan melaporkan kesalahan 5Selain itu, Anda dapat melihat garis yang tepat di mana kesalahan terjadi Laporan ini adalah pelacakan tumpukan, dan berguna untuk melacak masalah dalam kode Anda Jejak tumpukan bergerak dari bawah ke atas. Jadi disini 6Kita bisa bilang
Selain melihat jejak tumpukan ini di konsol browser, Anda dapat mengaksesnya di properti 8 dari objek errorJika pengecualian tidak tertangkap, yaitu tidak ada yang dilakukan oleh pemrogram untuk menangkapnya, program akan macet Kapan, dan di mana Anda menemukan pengecualian dalam kode Anda bergantung pada kasus penggunaan tertentu Misalnya Anda mungkin ingin menyebarkan pengecualian di tumpukan untuk menghentikan program sama sekali. Hal ini dapat terjadi karena kesalahan fatal, saat menghentikan program lebih aman daripada bekerja dengan data yang tidak valid Setelah memperkenalkan dasar-dasarnya, mari kita mengalihkan perhatian kita ke penanganan kesalahan dan pengecualian dalam kode JavaScript sinkron dan asinkron Penanganan kesalahan sinkronKode sinkron sebagian besar langsung, dan juga penanganan kesalahannya Penanganan kesalahan untuk fungsi regulerKode sinkron dijalankan dalam urutan yang sama dengan yang ditulis. Mari kita ambil lagi contoh sebelumnya _4Di sini mesin memanggil dan mengeksekusi _22. Semua terjadi secara sinkron. Untuk menangkap pengecualian yang berasal dari fungsi sinkron tersebut, kita dapat menggunakan 26 _8Biasanya, _27 berhubungan dengan happy path, atau dengan pemanggilan fungsi yang berpotensi melempar 28 sebagai gantinya, menangkap pengecualian yang sebenarnya. Itu menerima objek kesalahan, yang dapat kita periksa (dan kirim dari jarak jauh ke beberapa logger dalam produksi)Pernyataan _29 di sisi lain berjalan terlepas dari hasil fungsi. apakah itu gagal atau berhasil, kode apa pun di dalam ________2______29 akan berjalanIngat. 26 adalah konstruk sinkron. sekarang ada cara untuk menangkap pengecualian yang berasal dari kode asinkronPenanganan kesalahan untuk fungsi generatorFungsi generator dalam JavaScript adalah jenis fungsi khusus Itu dapat dijeda dan dilanjutkan sesuka hati, selain menyediakan saluran komunikasi dua arah antara ruang lingkup dalamnya dan konsumen Untuk membuat fungsi generator, kami menempatkan bintang 32 setelah kata kunci 33 _9Begitu berada di dalam fungsi, kita dapat menggunakan _34 untuk mengembalikan nilai _0Nilai balik dari fungsi generator adalah objek iterator. Untuk mengeluarkan nilai dari generator, kita dapat menggunakan dua pendekatan
Jika kita ambil contoh kita, untuk mendapatkan nilai dari generator bisa kita lakukan _1Di sini _37 menjadi objek iterator kita saat kita memanggil fungsi generatorMulai sekarang kita dapat memanggil _38 untuk memajukan eksekusi _2Generator juga bekerja sebaliknya. mereka dapat menerima kembali nilai dan pengecualian dari pemanggil Selain 35, objek iterator yang dikembalikan dari generator memiliki metode 40Dengan metode ini kita dapat menghentikan program dengan menyuntikkan pengecualian ke dalam generator _3Untuk menangkap kesalahan seperti itu, Anda akan membungkus kode Anda di dalam generator dengan 41 (dan 29 jika diperlukan) _4Fungsi generator juga dapat membuang pengecualian ke luar. Mekanisme untuk menangkap pengecualian ini sama dengan untuk menangkap pengecualian sinkron. _26Berikut adalah contoh fungsi generator yang dikonsumsi dari luar dengan 36 _5Di sini kami mengulangi jalur bahagia di dalam blok 27. Jika terjadi pengecualian, kami menghentikannya dengan 28Penanganan kesalahan asinkronJavaScript pada dasarnya sinkron, menjadi bahasa single-threaded Lingkungan host seperti mesin browser menambah JavaScript dengan sejumlah API Web untuk berinteraksi dengan sistem eksternal, dan untuk menangani operasi terikat I/O Contoh asinkronisitas pada browser adalah timeout, event, Promise Penanganan kesalahan di dunia asinkron berbeda dari mitra sinkronnya Mari kita lihat beberapa contoh Penanganan kesalahan untuk pengatur waktuDi awal penjelajahan Anda dengan JavaScript, setelah mempelajari tentang 26, Anda mungkin tergoda untuk meletakkannya di blok kode apa punPerhatikan cuplikan berikut _6Fungsi ini melempar setelah kira-kira 1 detik. Apa cara yang tepat untuk menangani pengecualian ini? Contoh berikut tidak berfungsi _7Seperti yang kami katakan, _41 sinkron. Di sisi lain kami memiliki _49, API browser untuk penghitung waktuPada saat callback diteruskan ke _49 berjalan, 41 kita sudah lama hilang. Program akan macet karena kami gagal menangkap pengecualianMereka melakukan perjalanan di dua jalur yang berbeda _8Jika kita tidak ingin merusak program, untuk menangani kesalahan dengan benar kita harus memindahkan 41 ke dalam callback untuk 49Namun, pendekatan ini seringkali tidak masuk akal. Seperti yang akan kita lihat nanti, penanganan kesalahan asinkron dengan Janji memberikan ergonomis yang lebih baik Penanganan kesalahan untuk acaraNode HTML dalam Model Objek Dokumen terhubung ke 54, leluhur bersama untuk penghasil peristiwa apa pun di browserItu artinya kita bisa ( _54 dalam rilis mendatang)Mekanisme penanganan kesalahan untuk peristiwa DOM mengikuti skema yang sama dari API Web asinkron apa pun Perhatikan contoh berikut _9Di sini kami memberikan pengecualian segera setelah tombol diklik. Bagaimana kita menangkapnya? 0Seperti contoh sebelumnya dengan _49, panggilan balik apa pun yang diteruskan ke 57 dijalankan secara asinkron 1Jika kita tidak ingin merusak program, untuk menangani kesalahan dengan benar kita harus memindahkan 41 ke dalam callback untuk 57Tetapi sekali lagi, tidak ada gunanya melakukan ini Seperti _49, pengecualian yang dilemparkan oleh jalur kode asinkron tidak dapat ditangkap dari luar, dan akan merusak program AndaDi bagian selanjutnya kita akan melihat bagaimana Janji dan 61 dapat memudahkan penanganan kesalahan untuk kode asinkronBagaimana dengan kesalahan?Elemen HTML memiliki sejumlah penangan acara seperti 62, 63, 64 untuk beberapa namaAda juga _65, tetapi tidak ada hubungannya dengan 19 dan teman-temanPenangan peristiwa _65 aktif setiap kali elemen HTML seperti tag ________2______68 atau 69 mengenai sumber daya yang tidak adaPerhatikan contoh berikut 2Saat mengunjungi dokumen HTML dengan sumber daya yang hilang atau tidak ada, konsol browser mencatat kesalahan tersebut 3Dalam JavaScript kami, kami memiliki kesempatan untuk "menangkap" kesalahan ini dengan event handler yang sesuai 4Atau lebih baik 5Pola ini berguna untuk memuat sumber daya alternatif menggantikan gambar atau skrip yang hilang Tapi ingat. 65, tidak ada hubungannya dengan 19 atau 41Penanganan kesalahan dengan JanjiUntuk mengilustrasikan penanganan kesalahan dengan Janji, kami akan "menjanjikan" salah satu contoh asli kami. Kami men-tweak fungsi berikut _4Alih-alih mengembalikan string sederhana, atau pengecualian, kami menggunakan masing-masing 73 dan 74 untuk menangani kesalahan dan keberhasilan 7(Secara teknis tidak ada yang asinkron dalam kode ini, tetapi berfungsi dengan baik untuk mengilustrasikan intinya) Sekarang setelah fungsinya "dijanjikan", kita dapat melampirkan 75 untuk menggunakan hasilnya, dan 28 untuk menangani Promise yang ditolak 8Kode ini akan masuk _9Di ranah Janji, _28 adalah konstruk untuk menangani kesalahanSelain _28 dan 75 kami juga memiliki 29, mirip dengan 29 di 41Sebagai "kerabat" sinkronnya, 29 Promise berjalan terlepas dari hasil Promise 0Ingatlah selalu bahwa panggilan balik apa pun yang diteruskan ke 84 ditangani secara asinkron oleh Antrean Microtask. Itu adalah tugas mikro dengan prioritas di atas tugas makro seperti acara dan pengatur waktuJanji, kesalahan, dan lemparSebagai praktik terbaik saat menolak Promise, sebaiknya berikan objek kesalahan 1Dengan melakukan itu, Anda menjaga konsistensi penanganan kesalahan melalui basis kode. Anggota tim lain selalu dapat berharap untuk mengakses 20, dan yang lebih penting Anda dapat memeriksa pelacakan tumpukanSelain 73, kita dapat keluar dari rantai Janji dengan melemparkan pengecualianPerhatikan contoh berikut 2Kami menyelesaikan Janji dengan sebuah string, dan kemudian rantai itu segera diputuskan dengan 19Untuk menghentikan propagasi pengecualian, kami menggunakan 28, seperti biasa 3Pola ini umum di 89, tempat kami memeriksa objek respons untuk mencari kesalahan 4Di sini pengecualian dapat dicegat dengan 28. Jika kita gagal, atau memutuskan untuk tidak menangkapnya di sana, pengecualian bebas untuk meluap di tumpukanIni tidak buruk, tetapi lingkungan yang berbeda bereaksi berbeda terhadap penolakan yang tidak tertangkap Node. js misalnya di masa mendatang akan membuat crash program apa pun di mana penolakan Promise tidak ditangani 5Lebih baik Anda menangkap mereka Penanganan kesalahan untuk pengatur waktu "dijanjikan".Dengan penghitung waktu atau peristiwa, tidak mungkin menangkap pengecualian yang dilemparkan dari panggilan balik. Kami melihat contoh di bagian sebelumnya 6Solusi yang ditawarkan oleh Janji terdiri dari "promisifikasi" kode kami. Pada dasarnya, kami membungkus pengatur waktu kami dengan Janji 7Dengan _91 kami memicu penolakan Janji, yang membawa objek kesalahanPada titik ini kami dapat menangani pengecualian dengan 28 8Catatan. umum untuk menggunakan 93 sebagai nilai kembalian dari Janji, dan 94 sebagai objek kembalian dari penolakanNode. js memiliki utilitas yang dipanggil untuk memudahkan "promisifikasi" API callback gaya lama Penanganan kesalahan di Janji. semuaMetode statis 95 menerima larik Janji, dan mengembalikan larik hasil dari semua Janji yang menyelesaikan _9Jika salah satu dari Janji ini ditolak, 95 menolak dengan kesalahan dari Janji pertama yang ditolakUntuk menangani situasi ini di _95 kami menggunakan 28, seperti yang kami lakukan di bagian sebelumnya 0Untuk menjalankan fungsi terlepas dari hasil 95, sekali lagi, kita dapat menggunakan 29 _1Penanganan kesalahan di Janji. setiapKami dapat menganggap 01 (Firefox > 79, Chrome > 85) sebagai kebalikan dari 95Sedangkan _95 mengembalikan kegagalan bahkan jika Janji tunggal dalam larik ditolak, 01 memberi kita Janji yang diselesaikan pertama kali (jika ada dalam larik) terlepas dari penolakan apa pun yang terjadiJika semua Janji yang diteruskan ke 01 ditolak, kesalahan yang dihasilkan adalah 14. Perhatikan contoh berikut _2Di sini kami menangani kesalahan dengan _28. Output dari kode ini adalah _3Objek _14 memiliki properti yang sama dengan properti 6 dasar, ditambah properti 10 _4Properti ini adalah larik dari setiap kesalahan individual yang dihasilkan oleh penolakan _5Penanganan kesalahan di Janji. balapanMetode statis _11 menerima array Promise _6Hasilnya Janji pertama yang memenangkan "perlombaan" Lalu bagaimana dengan penolakan? _7Jika penolakan malah muncul sebagai elemen pertama dari array, 11 menolak, dan kita harus menangkap penolakan _8Penanganan kesalahan di Janji. allSettled _14 adalah tambahan ECMAScript 2020 untuk bahasa iniTidak banyak yang harus ditangani dengan metode statis ini karena hasilnya akan selalu Promise yang diselesaikan, bahkan jika satu atau lebih input Promise ditolak Perhatikan contoh berikut _9Kami meneruskan ke _14 sebuah array yang terdiri dari dua Promise. satu diselesaikan dan yang lain ditolakDalam hal ini _28 tidak akan pernah terkena. 29 malah berjalanHasil kode ini, login _75 adalah _0Penanganan kesalahan untuk async/menunggu 61 dalam JavaScript menunjukkan fungsi asinkron, tetapi dari sudut pandang pembaca mereka mendapat manfaat dari semua keterbacaan fungsi sinkronUntuk mempermudah, kita akan menggunakan fungsi sinkron sebelumnya 22, dan mengubahnya menjadi fungsi asinkron dengan meletakkan 12 sebelum kata kunci ________2______33 _1Hanya dengan mengawali sebuah fungsi dengan 12 kita menyebabkan fungsi mengembalikan Promise. Itu berarti kita dapat menghubungkan 75, 28, dan 29 setelah pemanggilan fungsi _2Saat kita melempar dari fungsi _12, pengecualian menjadi penyebab penolakan untuk Janji yang mendasarinyaKesalahan apa pun dapat dicegat dengan _28 dari luarYang terpenting, selain gaya ini kita dapat menggunakan 26, seperti yang akan kita lakukan dengan fungsi sinkronDalam contoh berikut kita memanggil _22 dari fungsi lain, 31, yang dengan mudah membungkus pemanggilan fungsi dengan 26 _3Keluarannya adalah _4Pada topik yang sama. Bagaimana Cara Melempar Kesalahan Dari Fungsi Async di JavaScript? Penanganan kesalahan untuk generator asyncGenerator asinkron dalam JavaScript adalah fungsi generator yang mampu menghasilkan Janji, bukan nilai sederhana Mereka menggabungkan fungsi generator dengan _12. Hasilnya adalah fungsi generator yang objek iteratornya memaparkan Janji kepada konsumenUntuk membuat generator asinkron, kami mendeklarasikan fungsi generator dengan bintang 32, diawali dengan 12 _5Berdasarkan Janji, aturan yang sama untuk penanganan kesalahan berlaku di sini. 19 di dalam generator async menyebabkan penolakan Janji, yang kami mencegat dengan 28Untuk mengeluarkan Janji dari generator async, kita dapat menggunakan dua pendekatan
Dari contoh di atas kita tahu pasti akan ada pengecualian setelah dua yang pertama 34. Ini berarti kita bisa melakukannya _6Output dari kode ini adalah _7Pendekatan lain menggunakan async iterasi dengan 40. Untuk menggunakan iterasi asinkron, kita perlu membungkus konsumen dengan fungsi 12Berikut contoh lengkapnya _8Dan seperti _61 kami menangani potensi pengecualian dengan 41 _9Output dari kode ini adalah _0Objek iterator yang dikembalikan dari fungsi generator asinkron juga memiliki metode 40, seperti mitra sinkronnyaMemanggil _40 pada objek iterator di sini tidak akan memunculkan pengecualian, tetapi penolakan Janji _1Untuk menangani situasi ini dari luar bisa kita lakukan _2Tapi jangan lupa bahwa objek iterator 40 mengirim pengecualian di dalam generator. Ini berarti kita juga bisa menerapkan pola berikut _3Penanganan kesalahan di Node. jsPenanganan kesalahan sinkron di Node. jsPenanganan kesalahan sinkron di Node. js tidak jauh berbeda dari apa yang kita lihat sejauh ini Untuk kode sinkron, _26 berfungsi dengan baikNamun, hal-hal menjadi menarik jika kita melihat sekilas ke dunia asinkron Penanganan kesalahan asinkron di Node. js. pola panggilan balikUntuk kode asinkron, Node. js sangat bergantung pada dua idiom
Dalam pola panggilan balik, Node asinkron. js API menerima fungsi yang ditangani melalui event loop dan dieksekusi segera setelah tumpukan panggilan kosong Pertimbangkan kode berikut _4Jika kami mengekstrak panggilan balik dari daftar ini, kami dapat melihat bagaimana seharusnya menangani kesalahan _5Jika ada kesalahan yang muncul dari membaca jalur yang diberikan dengan 48, kami mendapatkan objek kesalahanPada titik ini kita bisa
Untuk membuang pengecualian bisa kita lakukan _6Namun, seperti kejadian dan pengatur waktu di DOM, pengecualian ini akan menghentikan program. Upaya berikut untuk menghentikannya dengan _41 tidak akan berhasil _7Meneruskan error ke callback lain adalah pilihan yang lebih disukai, jika kita tidak ingin merusak program _8Di sini _50 adalah apa namanya, fungsi sederhana untuk penanganan kesalahan _9Penanganan kesalahan asinkron di Node. js. pemancar acaraBanyak dari apa yang Anda lakukan di Node. js didasarkan pada peristiwa. Sebagian besar waktu Anda berinteraksi dengan objek emitor dan beberapa pengamat mendengarkan pesan Setiap modul yang digerakkan oleh peristiwa (seperti net misalnya) di Node. js memperluas kelas root bernama 51 _51 di Node. js memiliki dua metode mendasar. _53 dan 54Pertimbangkan server HTTP sederhana ini _0Di sini kita mendengarkan dua peristiwa. mendengarkan dan koneksi Selain event ini, emitter event juga menampilkan event error, yang diaktifkan jika terjadi error Jika Anda menjalankan mendengarkan kode ini di port 80 alih-alih contoh sebelumnya, Anda akan mendapatkan pengecualian _1Keluaran _2Untuk menangkapnya, kita dapat mendaftarkan event handler untuk error _3Ini akan dicetak _4Selain itu, program tidak akan macet Untuk mempelajari lebih lanjut tentang topik ini, pertimbangkan juga untuk membaca "Penanganan kesalahan di Node. js" MembungkusDalam panduan ini kami membahas penanganan kesalahan dalam JavaScript untuk seluruh spektrum, dari kode sinkron sederhana, hingga primitif asinkron tingkat lanjut Ada banyak cara pengecualian dapat terwujud dalam program JavaScript kami Pengecualian dari kode sinkron adalah yang paling mudah ditangkap. Pengecualian dari jalur kode asinkron malah bisa jadi rumit untuk ditangani Sementara itu, API JavaScript baru di browser hampir semuanya mengarah ke 55. Pola meresap ini memudahkan penanganan pengecualian dengan 84, atau dengan 41 untuk 61Setelah membaca panduan ini, Anda seharusnya dapat mengenali semua situasi berbeda yang mungkin muncul dalam program Anda, dan menangkap pengecualian Anda dengan benar Apa yang terjadi ketika terjadi kesalahan dalam JavaScript?Jika terjadi kesalahan di dalam blok try maka kontrol eksekusi dipindahkan ke blok catch . Dengan kata sederhana, coba periksa kesalahan apa pun, dan catch menerima kontrol eksekusi saat terjadi kesalahan dan dapat menanganinya. Setelah itu, program dilanjutkan seperti biasa. Jika tidak terjadi error, maka blok catch akan dilewati.
Apakah melempar kesalahan kembali dalam JavaScript?Anda tidak perlu memberikan pernyataan kembali setelah melempar , garis balik tidak akan pernah tercapai karena melempar pengecualian segera menyerahkan kendali kembali ke pemanggil.
Haruskah Anda membuang kesalahan di JS?Sebaiknya hindari melempar kesalahan dari dalam Promise , karena mungkin tidak selalu tertangkap, tergantung pada bagaimana kode yang memanggilnya disusun. Namun, merupakan praktik yang baik untuk mengembalikan kesalahan saat menolak Promise, dan Anda dapat mengembalikan jenis khusus Kesalahan seperti halnya Kesalahan lainnya.
Apakah melempar kesalahan menghentikan eksekusi?Untuk menangani pengecualian yang dilemparkan, Anda harus menangkapnya. Jika pengecualian dilemparkan dan tidak tertangkap oleh sesuatu, skrip berhenti mengeksekusi . |