mata teras
akan membuat kesilapan, tetapi apabila akan membuat ralat. Ciri -ciri dan ciri penyemak imbas yang tidak disediakan standard, hanya beberapa sumber masalah yang dihadapi oleh pemaju web. Memandangkan semua masalah yang mungkin timbul, JavaScript mempunyai kaedah pengendalian ralat yang mengejutkan - ia hanya menyerah dan gagal dengan senyap. Sekurang -kurangnya, ini adalah tingkah laku yang dilihat oleh pengguna. Malah, banyak perkara yang berlaku di belakang tabir. Apabila pernyataan JavaScript menghasilkan kesilapan, dikatakan bahawa ia melemparkan pengecualian
. JavaScript Interpreter tidak terus melaksanakan pernyataan seterusnya, tetapi cek untuk kod pengendalian pengecualian. Sekiranya tidak ada pengendali pengecualian, program ini akan kembali dari sebarang fungsi yang melemparkan pengecualian. Ini akan mengulangi setiap fungsi pada timbunan panggilan sehingga pengendali pengecualian ditemui atau fungsi peringkat atas dicapai, menyebabkan program ditamatkan.Objek ralat
Apabila pengecualian berlaku, objek yang mewakili ralat dibuat dan dilemparkan. Bahasa JavaScript mentakrifkan tujuh jenis objek ralat terbina dalam. Jenis ralat ini adalah asas untuk pengendalian pengecualian. Setiap jenis ralat diterangkan secara terperinci di bawah.ralat
jenis "Ralat" digunakan untuk menunjukkan pengecualian umum. Jenis pengecualian ini biasanya digunakan untuk melaksanakan pengecualian yang ditentukan oleh pengguna. Topik penciptaan pengecualian yang ditentukan pengguna akan dikaji semula kemudian dalam artikel ini. Objek "Ralat" ditandakan dengan memanggil pembina, seperti yang ditunjukkan dalam contoh berikut:
Apabila nombor melebihi julat yang ditentukan, pengecualian "RangeError" dijana. Sebagai contoh, nombor JavaScript mempunyai kaedah tofixed (), yang mengambil parameter "digit" untuk mewakili bilangan digit yang muncul selepas titik perpuluhan. Parameter ini harus antara 0 dan 20 (walaupun beberapa pelayar menyokong julat yang lebih luas). Jika nilai "digit" berada di luar julat ini, "RangeError" dilemparkan. Contoh berikut menunjukkan ini.
var error = new Error("error message");
Apabila mengakses pembolehubah yang tidak wujud, pengecualian "ReferenceArror" akan dibuang. Pengecualian ini biasanya berlaku apabila terdapat nama pembolehubah sedia ada yang salah eja. Dalam contoh berikut, "ReferenceRor" berlaku apabila mengakses "bar". Perhatikan bahawa contoh ini mengandaikan bahawa "bar" tidak wujud dalam mana -mana skop aktif apabila cuba meningkatkan operasi.
var pi = 3.14159; pi.toFixed(100000); // RangeError
Apabila peraturan bahasa JavaScript dilanggar, "SyntaxError" akan dibuang. Pemaju yang biasa dengan bahasa seperti C dan Java digunakan untuk menghadapi kesilapan sintaks semasa penyusunan. Walau bagaimanapun, sejak JavaScript adalah bahasa yang ditafsirkan, kesilapan sintaks tidak diiktiraf sehingga kod itu dilaksanakan. Kesalahan sintaks adalah unik kerana ia adalah satu -satunya jenis pengecualian yang tidak dapat dipulihkan. Contoh berikut menghasilkan ralat sintaks kerana pernyataan "jika" tidak mempunyai pendakap yang betul.
function foo() { bar++; // ReferenceError }
Apabila nilai bukan jenis yang diharapkan, pengecualian "TypeError" berlaku. Cuba memanggil kaedah objek yang tidak wujud adalah punca umum pengecualian tersebut. Contoh berikut mencipta objek kosong bernama "Foo" dan kemudian cuba memanggil kaedah bar (). Oleh kerana bar () tidak ditakrifkan, "TypeError" dilemparkan ketika cuba memanggilnya.
if (foo) { // SyntaxError // 缺少右花括号 }
Apabila kaedah seperti encodeuri () dan decodeuri () menghadapi uri yang cacat, pengecualian "urierror" akan dibuang. Contoh berikut menghasilkan "urierror" apabila cuba menyahkodkan rentetan "%". Watak "%" menunjukkan permulaan urutan melarikan diri URI. Oleh kerana tiada apa -apa selepas "%" dalam contoh ini, rentetan itu adalah urutan melarikan diri yang tidak sah dan oleh itu komponen URI yang cacat.
var foo = {}; foo.bar(); // TypeError
Apabila fungsi eval () tidak digunakan, pengecualian "evalerror" akan dibuang. Pengecualian ini tidak digunakan dalam versi terkini standard ECMAScript. Walau bagaimanapun, untuk mengekalkan keserasian mundur dengan piawaian versi lama, mereka masih disokong.
Pengendalian Pengecualian
Sekarang kita tahu apa pengecualian, kita harus belajar bagaimana untuk menghalang mereka daripada menyebabkan program itu terhempas. JavaScript mengendalikan pengecualian melalui pernyataan "cuba ... menangkap ... akhirnya". Kenyataan contoh biasa ditunjukkan di bawah.
decodeURIComponent("%"); // URIError
Bahagian pertama "cuba ... menangkap ... akhirnya" pernyataan adalah klausa "cuba". Klausa "Cuba" diperlukan untuk memisahkan blok kod yang disyaki pengatur boleh menghasilkan pengecualian. Klausa "cuba" mesti diikuti oleh satu atau dua "tangkapan" dan "akhirnya" klausa.
"Catch" fasal
Bahagian kedua "cuba ... menangkap ... akhirnya" adalah klausa "tangkapan". Klausa "tangkapan" adalah blok kod yang dilaksanakan hanya apabila pengecualian berlaku dalam klausa "cuba". Walaupun klausa "menangkap" adalah pilihan, adalah mustahil untuk mengendalikan pengecualian tanpa ia. Ini kerana klausa "menangkap" menghalang pengecualian daripada menyebarkan dalam timbunan panggilan, yang membolehkan pemulihan program. Sekiranya pengecualian berlaku di blok "cuba", kawalan segera diserahkan kepada klausa "tangkapan". Pengecualian yang berlaku juga diserahkan kepada blok "tangkapan" untuk pemprosesan. Contoh berikut menunjukkan cara menggunakan klausa "tangkapan" untuk mengendalikan "ReferenceRor". Perhatikan bahawa objek "ReferenceError" boleh digunakan dalam klausa "tangkapan" melalui pemboleh ubah "pengecualian".
var error = new Error("error message");
Aplikasi kompleks boleh menjana pelbagai pengecualian. Dalam kes ini, pengendali "Instanceof" boleh digunakan untuk membezakan pelbagai jenis pengecualian. Dalam contoh berikut, diandaikan bahawa klausa "cuba" dapat menghasilkan beberapa jenis pengecualian. Klausa "tangkapan" yang sepadan menggunakan "contoh" untuk mengendalikan pengecualian "typeError" dan "referenceror" secara berasingan dari semua jenis kesilapan yang lain.
var pi = 3.14159; pi.toFixed(100000); // RangeError
"Akhirnya" klausa
Komponen terakhir "cuba ... menangkap ... akhirnya" pernyataan adalah klausa pilihan "Akhirnya". Klausa "akhirnya" adalah blok kod yang dilaksanakan selepas klausa "cuba" dan "menangkap", tanpa mengira sama ada ralat berlaku. Klausa "akhirnya" berguna untuk memasukkan kod pembersihan (penutupan fail, dll) yang perlu dilaksanakan. Perhatikan bahawa klausa "akhirnya" melaksanakan walaupun pengecualian yang tidak diketahui berlaku. Dalam kes ini, klausa "akhirnya" dilaksanakan, dan pengecualian yang dilemparkan berterusan secara normal.
Nota menarik mengenai klausa "akhirnya" adalah bahawa walaupun klausa "cuba" atau "menangkap" melaksanakan pernyataan "kembali", ia akan dilaksanakan. Sebagai contoh, fungsi berikut mengembalikan palsu kerana klausa "akhirnya" adalah kandungan terakhir yang dilaksanakan.
function foo() { bar++; // ReferenceError }
atas pengecualian
JavaScript membolehkan pengaturcara membuang pengecualian mereka sendiri melalui kenyataan yang dinamakan "membuang". Konsep ini boleh menjadi sedikit mengelirukan bagi pemaju yang tidak berpengalaman. Lagipun, pemaju berjuang untuk menulis kod tanpa kesilapan, tetapi pernyataan "membuang" sengaja memperkenalkan kesilapan. Walau bagaimanapun, dengan sengaja membuang pengecualian sebenarnya boleh membuat kod lebih mudah untuk debug dan mengekalkan. Sebagai contoh, dengan membuat mesej ralat yang bermakna, lebih mudah untuk mengenal pasti dan menyelesaikan masalah.
Berikut menunjukkan beberapa contoh pernyataan "lempar". Tiada had pada jenis data yang boleh dibuang sebagai pengecualian. Tidak ada batasan pada bilangan kali data yang sama dapat ditangkap dan dilemparkan. Dalam erti kata lain, pengecualian boleh dibuang, ditangkap, dan kemudian dibuang lagi.
if (foo) { // SyntaxError // 缺少右花括号 }
Walaupun pernyataan "lemparan" boleh digunakan dengan mana-mana jenis data, menggunakan jenis pengecualian terbina dalam mempunyai beberapa kelebihan. Sebagai contoh, Firefox mengkhususkan diri dalam objek ini dengan menambah maklumat debug, seperti nama fail dan nombor baris di mana pengecualian berlaku.
Sebagai contoh, katakan bahawa operasi bahagian berlaku di suatu tempat dalam permohonan anda. Memandangkan terdapat situasi di mana pembahagian oleh sifar berlaku, pembahagian boleh menyusahkan. Dalam JavaScript, operasi tersebut menghasilkan "nan". Ini boleh membawa kepada hasil yang mengelirukan yang sukar untuk debug. Jika aplikasi mengadu dengan kuat tentang pembahagian dengan sifar, keadaan akan menjadi lebih mudah. Kenyataan berikut "jika" melakukan ini dengan membuang pengecualian.
var error = new Error("error message");
Sudah tentu, mungkin lebih sesuai untuk menggunakan "RangeError", seperti yang ditunjukkan di bawah:
var pi = 3.14159; pi.toFixed(100000); // RangeError
Objek Pengecualian Custom
Kami hanya belajar bagaimana untuk menghasilkan mesej ralat tersuai menggunakan jenis pengecualian terbina dalam. Walau bagaimanapun, cara lain adalah untuk membuat jenis pengecualian baru dengan memperluaskan jenis "ralat" yang sedia ada. Oleh kerana jenis baru mewarisi dari "ralat", ia boleh digunakan seperti jenis pengecualian terbina dalam yang lain. Walaupun artikel ini tidak membincangkan topik warisan dalam JavaScript, teknik mudah diperkenalkan di sini.
Contoh berikut akan kembali kepada masalah mengendalikan pembahagian dengan sifar. Daripada menggunakan objek "Ralat" atau "RangeError" seperti dahulu, kami mahu membuat jenis pengecualian kami sendiri. Dalam contoh ini, kami mencipta jenis pengecualian "DivisionByZereerror". Fungsi dalam contoh bertindak sebagai pembina jenis baru kami. Pembina bertanggungjawab untuk memberikan atribut "nama" dan "mesej". Dua baris terakhir contohnya membolehkan jenis baru mewarisi dari objek "Ralat".
function foo() { bar++; // ReferenceError }
Perkara yang perlu diingat
JavaScript Exception Handling FAQ
Apakah perbezaan antara kesilapan sintaks dan kesilapan runtime dalam JavaScript?
Sebaliknya, ralat runtime berlaku semasa pelaksanaan program, selepas penyusunan yang berjaya. Kesalahan ini biasanya disebabkan oleh operasi haram yang dilakukan oleh kod. Sebagai contoh, cuba mengakses pemboleh ubah yang tidak ditentukan atau memanggil fungsi yang tidak wujud boleh menyebabkan ralat runtime.
Bagaimana menangani pengecualian dalam JavaScript?
var error = new Error("error message");
Blok "Akhirnya" dalam JavaScript digunakan untuk melaksanakan kod selepas cuba dan menangkap blok, tanpa mengira hasilnya. Ini bermakna bahawa kod dalam blok "akhirnya" akan dilaksanakan tanpa mengira sama ada pengecualian dilemparkan atau tidak. Ia biasanya digunakan untuk membersihkan selepas kod dilaksanakan, seperti menutup fail atau sumber penjelasan.
Ya, JavaScript membolehkan anda membuang pengecualian anda sendiri menggunakan pernyataan "lempar". Anda boleh membuang apa -apa jenis pengecualian, termasuk rentetan, nombor, nilai boolean, atau objek. Sebaik sahaja pengecualian dilemparkan, proses normal program akan dihentikan dan kawalan akan diserahkan kepada pengendali pengecualian terkini.
JavaScript membolehkan anda membuat jenis ralat tersuai dengan memperluaskan objek ralat terbina dalam. Ini berguna apabila anda ingin membuang jenis ralat tertentu dalam kod anda. Berikut adalah contoh:
var pi = 3.14159; pi.toFixed(100000); // RangeError
Penyebaran ralat merujuk kepada proses lulus kesilapan dari mana ia dilemparkan ke pengendali pengecualian terdekat dalam timbunan panggilan. Sekiranya tiada kesilapan ditangkap dalam fungsi yang melemparkan kesilapan, ia akan disebarkan ke atas ke fungsi panggilan, dan sebagainya sehingga ia ditangkap atau mencapai skop global, di mana program itu akan ditamatkan.
JavaScript menyediakan kaedah Console.error () untuk log ralat. Kaedah ini berfungsi dengan cara yang sama seperti console.log (), tetapi ia juga mengandungi jejak timbunan dalam log dan menyoroti mesej sebagai ralat dalam konsol. Berikut adalah contoh:
function foo() { bar++; // ReferenceError }
Dalam JavaScript, kedua -duanya "Null" dan "Undefined" menunjukkan nilai yang hilang. Walau bagaimanapun, ia digunakan dalam konteks yang sedikit berbeza. "Undefined" bermaksud bahawa pembolehubah telah diisytiharkan tetapi belum diberikan nilai. "Null" sebaliknya adalah nilai tugasan, menunjukkan tiada nilai atau tiada objek.
kesilapan asynchronous boleh dikendalikan menggunakan janji atau async/menunggu di JavaScript. Janji mempunyai kaedah "tangkapan" yang dipanggil apabila janji ditolak. Dengan Async/menunggu anda boleh menggunakan blok percubaan/tangkapan seperti yang anda lakukan dengan kod segerak. Berikut adalah contoh menggunakan async/menunggu:
if (foo) { // SyntaxError // 缺少右花括号 }
Apabila operasi tidak dapat dilakukan, biasanya apabila nilai itu bukan jenis yang diharapkan, typeError dilemparkan dalam JavaScript. Sebagai contoh, cuba memanggil bukan fungsi atau mengakses harta yang tidak ditentukan akan mengakibatkan TypeError.
Atas ialah kandungan terperinci Pengendalian pengecualian yang luar biasa di JavaScript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!