Rumah >hujung hadapan web >tutorial js >Pengendalian pengecualian yang luar biasa di JavaScript

Pengendalian pengecualian yang luar biasa di JavaScript

Joseph Gordon-Levitt
Joseph Gordon-Levittasal
2025-02-26 08:38:10616semak imbas

Exceptional Exception Handling in JavaScript

mata teras

    Pengendalian pengecualian JavaScript dilaksanakan melalui pernyataan "Cuba ... Tangkap ... Akhirnya". Klausa "cuba" mengandungi kod yang boleh menghasilkan pengecualian, klausa "menangkap" dilaksanakan apabila pengecualian berlaku, dan klausa "akhirnya" akan dilaksanakan tanpa mengira hasilnya.
  • JavaScript mempunyai tujuh objek ralat terbina dalam untuk pengendalian pengecualian: Ralat, RangeError, ReferenceRor, SyntaxError, TypeError, Urierror, dan Everror. Setiap objek mewakili jenis ralat tertentu.
  • JavaScript membolehkan pemaju membuang pengecualian mereka sendiri menggunakan pernyataan "lempar". Ini boleh menjadikan kod lebih mudah untuk debug dan mengekalkan kerana ia membolehkan penciptaan mesej ralat yang bermakna.
  • boleh membuat jenis pengecualian tersuai dengan memperluaskan jenis "ralat" sedia ada. Ini membolehkan pengendalian ralat yang lebih spesifik dan relevan dalam aplikasi yang kompleks.
Dalam pembangunan perisian, undang -undang Murphy juga terpakai: apa -apa yang boleh salah akan salah. Untuk program yang tidak mudah, persoalannya bukan sama ada

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:

objek "Ralat" mengandungi dua sifat, "Nama" dan "Mesej". Harta "Nama" menentukan jenis pengecualian (dalam kes ini "ralat"). Harta "Mesej" memberikan penerangan yang lebih terperinci tentang pengecualian. "Mesej" mendapat nilainya dari rentetan yang dihantar kepada pembina pengecualian. Jenis pengecualian yang tinggal mewakili jenis ralat yang lebih spesifik, tetapi ia digunakan dengan cara yang sama seperti jenis "ralat" umum.

RangeError

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.

<code class="language-javascript">var error = new Error("error message");</code>

ReferenceError

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.

<code class="language-javascript">var pi = 3.14159;

pi.toFixed(100000);  // RangeError</code>

SyntaxError

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.

<code class="language-javascript">function foo() {
  bar++;  // ReferenceError
}</code>

TypeError

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.

<code class="language-javascript">if (foo) {  // SyntaxError
  // 缺少右花括号
}</code>

urierror

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.

<code class="language-javascript">var foo = {};

foo.bar(); // TypeError</code>

evalError

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.

<code class="language-javascript">decodeURIComponent("%"); // URIError</code>

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".

<code class="language-javascript">var error = new Error("error message");</code>

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.

<code class="language-javascript">var pi = 3.14159;

pi.toFixed(100000);  // RangeError</code>

"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.

<code class="language-javascript">function foo() {
  bar++;  // ReferenceError
}</code>

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.

<code class="language-javascript">if (foo) {  // SyntaxError
  // 缺少右花括号
}</code>

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.

<code class="language-javascript">var error = new Error("error message");</code>

Sudah tentu, mungkin lebih sesuai untuk menggunakan "RangeError", seperti yang ditunjukkan di bawah:

<code class="language-javascript">var pi = 3.14159;

pi.toFixed(100000);  // RangeError</code>

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".

<code class="language-javascript">function foo() {
  bar++;  // ReferenceError
}</code>

Perkara yang perlu diingat

  • pernyataan "cuba ... menangkap ... akhirnya" digunakan untuk mengendalikan pengecualian.
  • "Cuba" klausa mengenal pasti kod yang boleh menghasilkan pengecualian.
  • Klausa "tangkapan" hanya dilaksanakan apabila pengecualian berlaku.
  • klausa "akhirnya" sentiasa dilaksanakan, tidak kira apa pun.
  • Kenyataan "lemparan" digunakan untuk menghasilkan pengecualian.
  • Objek pengecualian tersuai harus mewarisi dari jenis "ralat" yang ada.
  • Gambar dari Fotolia

JavaScript Exception Handling FAQ

Apakah perbezaan antara kesilapan sintaks dan kesilapan runtime dalam JavaScript?

ralat sintaks, juga dikenali sebagai kesilapan parsing, berlaku pada masa penyusunan dalam bahasa pengaturcaraan tradisional dan pada masa tafsiran dalam JavaScript. Ralat sintaks berlaku apabila kod tersebut tidak betul secara sintaktik dan tidak boleh dihuraikan. Sebagai contoh, jika anda lupa pendakap penutupan atau gunakan aksara haram, ralat sintaks berlaku.

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?

JavaScript menyediakan percubaan ... menangkap pernyataan untuk mengendalikan pengecualian. Blok percubaan mengandungi kod yang boleh membuang pengecualian, manakala blok tangkapan mengandungi kod yang akan dilaksanakan jika pengecualian dilemparkan ke dalam blok percubaan. Berikut adalah contoh mudah:

<code class="language-javascript">var error = new Error("error message");</code>

Apakah tujuan "akhirnya" blok di JavaScript?

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.

Bolehkah saya membuang pengecualian saya sendiri dalam JavaScript?

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.

Bagaimana untuk membuat jenis ralat tersuai dalam JavaScript?

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:

<code class="language-javascript">var pi = 3.14159;

pi.toFixed(100000);  // RangeError</code>

Apakah penyebaran ralat dalam JavaScript?

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.

Bagaimana untuk log kesilapan dalam JavaScript?

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:

<code class="language-javascript">function foo() {
  bar++;  // ReferenceError
}</code>

Apakah perbezaan antara "Null" dan "Undefined" dalam JavaScript?

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.

Bagaimana menangani kesilapan asynchronous dalam JavaScript?

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:

<code class="language-javascript">if (foo) {  // SyntaxError
  // 缺少右花括号
}</code>

Apa itu TypeError dalam JavaScript?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn