


Pengecualian JavaScript mengendalikan kemahiran explanation_javascript terperinci
Jurutera hadapan semua tahu bahawa JavaScript mempunyai keupayaan pengendalian pengecualian asas. Kami boleh membuang Ralat baharu(), dan penyemak imbas juga akan membuang pengecualian apabila kami membuat ralat semasa memanggil API. Tetapi dianggarkan kebanyakan jurutera hadapan tidak pernah mempertimbangkan untuk mengumpul maklumat yang tidak normal ini
Bagaimanapun, selagi ralat JavaScript tidak muncul semula selepas menyegarkan, pengguna boleh menyelesaikan masalah dengan menyegarkan dan penyemak imbas tidak akan ranap. Andaian ini berlaku sebelum Apl Halaman Tunggal menjadi popular. Status Apl Halaman Tunggal semasa menjadi sangat rumit selepas dijalankan untuk tempoh masa Pengguna mungkin telah melakukan beberapa operasi input sebelum tiba di sini. Bukankah operasi sebelumnya sepatutnya dibuat semula sepenuhnya? Oleh itu, kami masih perlu menangkap dan menganalisis maklumat pengecualian ini, dan kemudian kami boleh mengubah suai kod untuk mengelak daripada menjejaskan pengalaman pengguna.
Cara menangkap pengecualian
Ralat baru lontaran() yang kami tulis sendiri pastinya boleh ditangkap jika kami mahu, kerana kami tahu dengan tepat di mana lontaran ditulis. Walau bagaimanapun, pengecualian yang berlaku apabila memanggil API penyemak imbas tidak semestinya mudah ditangkap Sesetengah API ditulis dalam piawaian untuk membuang pengecualian, dan sesetengah API hanya dilemparkan oleh penyemak imbas individu disebabkan oleh perbezaan pelaksanaan atau kecacatan. Untuk yang pertama, kita juga boleh menangkapnya melalui cuba-tangkap Untuk yang terakhir, kita mesti mendengar pengecualian global dan kemudian menangkapnya.
cuba tangkap
Jika sesetengah API penyemak imbas diketahui membuang pengecualian, maka kita perlu meletakkan panggilan dalam try-catch untuk menghalang keseluruhan program daripada memasuki keadaan haram akibat ralat. Sebagai contoh, window.localStorage ialah API sedemikian. Ia akan mengeluarkan pengecualian selepas menulis data melebihi had kapasiti Ini juga akan berlaku dalam mod penyemakan imbas peribadi.
cuba {
localStorage.setItem('date', Date.now());
} tangkap (ralat) {
reportError(error);
}
Satu lagi kes penggunaan biasa untuk try-catch ialah panggilan balik. Oleh kerana kod fungsi panggil balik di luar kawalan kami, kami tidak tahu tentang kualiti kod atau sama ada API lain yang akan mengeluarkan pengecualian akan dipanggil. Untuk mengelakkan kod lain selepas memanggil balik daripada tidak dapat dilaksanakan kerana ralat panggil balik, panggilan balik perlu dimasukkan ke dalam try-catch.
listeners.forEach(function(pendengar) {
cuba {
pendengar();
} tangkap (ralat) {
reportError(error);
}
});
tetingkap.onerror
Untuk kawasan yang tidak diliputi oleh try-catch, jika pengecualian berlaku, ia hanya boleh ditangkap melalui window.onerror.
window.onerror =
function(errorMessage, scriptURI, lineNumber) {
reportError({
mesej: errorMessage,
skrip: scriptURI,
baris: lineNumber
});
}
Berhati-hati untuk tidak menjadi pandai dan gunakan window.addEventListener atau window.attachEvent untuk mendengar window.onerror. Banyak pelayar hanya melaksanakan window.onerror, atau hanya pelaksanaan window.onerror adalah standard. Memandangkan draf standard juga mentakrifkan window.onerror, kita hanya boleh menggunakan window.onerror.
Atribut hilang
Andaikan kami mempunyai fungsi reportError untuk mengumpul pengecualian yang ditangkap, dan kemudian menghantarnya ke storan sisi pelayan secara berkelompok untuk pertanyaan dan analisis, maka apakah maklumat yang ingin kami kumpulkan? Maklumat yang lebih berguna termasuk: jenis ralat (nama), mesej ralat (mesej), alamat fail skrip (skrip), nombor baris (baris), nombor lajur (lajur) dan surih tindanan (tindanan). Jika pengecualian ditangkap melalui cuba-tangkap, maklumat ini berada pada objek Ralat (disokong oleh penyemak imbas arus perdana), jadi reportError juga boleh mengumpul maklumat ini. Tetapi jika ia ditangkap melalui window.onerror, kita semua tahu bahawa fungsi acara ini hanya mempunyai 3 parameter, jadi maklumat yang tidak dijangka dari 3 parameter ini hilang.
Mesej bersiri
Jika objek Ralat dicipta oleh kami sendiri, maka error.message dikawal oleh kami. Pada asasnya, apa sahaja yang kita masukkan ke dalam error.message, parameter pertama (message) window.onerror ialah. (Penyemak imbas sebenarnya akan membuat sedikit pengubahsuaian, seperti menambah awalan 'Ralat Tidak Ditangkap:'.) Oleh itu, kita boleh mensirikan sifat yang kita sayangi (seperti JSON.Stringify) dan menyimpannya dalam error.message, dan kemudian membacanya dalam window.onerror Hanya keluarkan dan nyahserikannya. Sudah tentu, ini terhad kepada objek Ralat yang kita cipta sendiri.
Parameter kelima
Pengilang penyemak imbas juga mengetahui batasan yang dihadapi oleh orang ramai apabila menggunakan window.onerror, jadi mereka mula menambah parameter baharu pada window.onerror. Memandangkan hanya nombor baris tetapi tiada nombor lajur kelihatan tidak terlalu simetri, IE mula-mula menambah nombor lajur dan meletakkannya dalam parameter keempat. Walau bagaimanapun, semua orang lebih mengambil berat tentang sama ada mereka boleh mendapatkan tindanan lengkap, jadi Firefox berkata adalah lebih baik untuk meletakkan tindanan dalam parameter kelima. Tetapi Chrome berkata bahawa adalah lebih baik untuk meletakkan keseluruhan objek Ralat dalam parameter kelima Anda boleh membaca mana-mana sifat yang anda inginkan, termasuk sifat tersuai. Akibatnya, Chrome bergerak lebih pantas dan melaksanakan tetingkap baharu. tandatangan onerror dalam Chrome 30, yang menyebabkan draf standard ditulis dengan sewajarnya.
window.onerror = function(
mesej ralat,
scriptURI,
Nombor baris,
Nombor lajur,
ralat
) {
jika (ralat) {
reportError(error);
} lain {
reportError({
mesej: errorMessage,
skrip: scriptURI,
baris: lineNumber,
lajur: lajurNombor
});
}
}
Penyaturan atribut
Nama atribut objek Ralat yang kami bincangkan sebelum ini adalah berdasarkan kaedah penamaan Chrome Walau bagaimanapun, penyemak imbas yang berbeza menamakan atribut objek Ralat secara berbeza Contohnya, alamat fail skrip dipanggil skrip dalam Chrome tetapi dipanggil nama fail dalam Firefox. . Oleh itu, kita juga memerlukan fungsi khas untuk menormalkan objek Ralat, iaitu, untuk memetakan nama atribut yang berbeza kepada nama atribut bersatu. Untuk kaedah khusus, sila rujuk artikel ini. Walaupun pelaksanaan penyemak imbas akan dikemas kini, mengekalkan jadual pemetaan sedemikian secara manual tidaklah terlalu sukar.
Serupa dengan format surih tindanan. Atribut ini menyimpan timbunan maklumat pengecualian dalam bentuk teks biasa Memandangkan format teks yang digunakan oleh setiap penyemak imbas adalah berbeza, ia juga perlu mengekalkan ungkapan biasa secara manual untuk mengekstrak fungsi setiap bingkai daripada teks biasa (. pengecam), fail (skrip), nombor baris (baris) dan nombor lajur (lajur).
Sekatan keselamatan
Jika anda juga mengalami ralat dengan mesej 'Skrip ralat.', anda akan memahami perkara yang saya maksudkan Ini sebenarnya adalah had penyemak imbas untuk fail skrip dari asal yang berbeza. Sebab untuk sekatan keselamatan ini adalah ini: dengan mengandaikan bahawa HTML yang dikembalikan oleh bank dalam talian selepas pengguna log masuk adalah berbeza daripada HTML yang dilihat oleh pengguna tanpa nama, tapak web pihak ketiga boleh meletakkan URI bank dalam talian ke dalam skrip. atribut src. Sudah tentu, HTML tidak boleh dihuraikan sebagai JS, jadi penyemak imbas akan membuang pengecualian, dan tapak web pihak ketiga boleh menentukan sama ada pengguna dilog masuk dengan menghuraikan lokasi pengecualian. Atas sebab ini, penyemak imbas menapis semua pengecualian yang dilemparkan oleh fail skrip daripada sumber yang berbeza sehingga hanya satu mesej yang tidak berubah seperti 'Ralat skrip yang tinggal, dan semua atribut lain hilang.
Untuk tapak web dalam skala tertentu, adalah perkara biasa untuk fail skrip diletakkan pada CDN dengan sumber yang berbeza. Sekarang walaupun anda membina tapak web kecil anda sendiri, rangka kerja biasa seperti jQuery dan Backbone boleh merujuk terus versi pada CDN awam untuk mempercepatkan muat turun pengguna. Jadi sekatan keselamatan ini menyebabkan beberapa masalah, menyebabkan maklumat pengecualian yang kami kumpulkan daripada Chrome dan Firefox menjadi 'Ralat Skrip' yang sia-sia.
CORS
Untuk memintas sekatan ini, cuma pastikan fail skrip dan halaman itu sendiri mempunyai asal yang sama. Tetapi meletakkan fail skrip pada pelayan yang tidak dipercepatkan oleh CDN tidak akan memperlahankan kelajuan muat turun pengguna? Satu penyelesaian ialah dengan terus meletakkan fail skrip pada CDN, gunakan XMLHttpRequest untuk memuat turun semula kandungan melalui CORS, dan kemudian buat teg
Ini kelihatan mudah, tetapi terdapat banyak butiran untuk dilaksanakan. Mari kita gunakan contoh mudah:
">http://cdn.com/step1.js">>
(fungsi step2() {})();
">http://cdn.com/step3.js">>
Kita semua tahu bahawa jika terdapat kebergantungan antara step1, step2 dan step3, ia mesti dilaksanakan dengan ketat dalam susunan ini, jika tidak ralat mungkin berlaku. Penyemak imbas boleh meminta fail step1 dan step3 secara selari, tetapi pesanan itu dijamin semasa pelaksanaan. Jika kami memperoleh sendiri kandungan fail step1 dan step3 melalui XMLHttpRequest, kami perlu memastikan ketepatan pesanan itu. Di samping itu, jangan lupa step2. Step2 boleh dilaksanakan apabila step1 dimuat turun secara tidak menyekat, jadi kita juga mesti campur tangan secara manual dalam step2 untuk membiarkannya menunggu langkah1 selesai sebelum melaksanakannya.
Jika kami sudah mempunyai set alat untuk menjana teg
scheduleRemoteScript('http://cdn.com/step1.js');
scheduleInlineScript(kod fungsi() {
(fungsi step2() {})();
});
scheduleRemoteScript('http://cdn.com/step3.js');
Kami perlu melaksanakan dua fungsi scheduleRemoteScript dan scheduleInlineScript, dan memastikan bahawa ia ditakrifkan sebelum teg
Seterusnya kita perlu melaksanakan mekanisme lengkap untuk memastikan kandungan fail yang dimuat turun oleh scheduleRemoteScript berdasarkan alamat dan kod yang diperoleh secara langsung oleh scheduleInlineScript boleh dilaksanakan satu demi satu dalam susunan yang betul. Saya tidak akan memberikan kod terperinci di sini Jika anda berminat, anda boleh melaksanakannya sendiri.
Semakan nombor baris terbalik
Mendapatkan kandungan melalui CORS dan kemudian menyuntik kod ke dalam halaman boleh menembusi sekatan keselamatan, tetapi ia akan memperkenalkan masalah baharu, iaitu konflik nombor baris. Pada asalnya, error.script boleh digunakan untuk mencari fail skrip unik dan error.line boleh digunakan untuk mencari nombor baris unik. Sekarang, kerana kesemuanya adalah kod yang dibenamkan dalam halaman, berbilang
Untuk mengelakkan konflik nombor baris, kita boleh membazirkan beberapa nombor baris supaya julat nombor baris yang digunakan oleh kod sebenar dalam setiap teg
Selepas pemprosesan ini, jika error.line bagi ralat ialah 3005, ini bermakna error.script sebenar hendaklah 'http://cdn.com/step3.js' dan error.line sebenar hendaklah 5 . Kita boleh melengkapkan semakan terbalik nombor baris ini dalam fungsi reportError yang dinyatakan sebelum ini.
Sudah tentu, kerana kami tidak dapat menjamin bahawa setiap fail skrip hanya mempunyai 1000 baris dan sesetengah fail skrip mungkin kurang daripada 1000 baris, anda tidak perlu memperuntukkan julat tetap 1000 baris untuk setiap teg
atribut silang asal
Sekatan keselamatan yang dikenakan oleh penyemak imbas pada kandungan daripada sumber yang berbeza sudah tentu tidak terhad kepada teg
Sekatan pada Jika teg
adalah daripada sumber yang berbeza, sebaik sahaja ia digunakan dalam lukisan
menyelesaikan masalah ini dengan memperkenalkan atribut silang asal. Jika anda menggunakan crossorigin="anonymous", ia bersamaan dengan CORS tanpa nama jika anda menggunakan `crossorigin="use-credentials", ia bersamaan dengan CORS dengan pengesahan.
Jika teg boleh melakukan ini, mengapa teg
Ringkasan
Pengendalian pengecualian JavaScript kelihatan sangat mudah, tidak berbeza dengan bahasa lain, tetapi sebenarnya tidak semudah itu untuk menangkap semua pengecualian dan kemudian menganalisis atribut. Walaupun terdapat beberapa perkhidmatan pihak ketiga yang menyediakan perkhidmatan seperti Analitis Google yang menangkap pengecualian JavaScript, jika anda ingin memahami butiran dan prinsip, anda masih perlu melakukannya sendiri.

Python dan JavaScript mempunyai kelebihan dan kekurangan mereka sendiri dari segi komuniti, perpustakaan dan sumber. 1) Komuniti Python mesra dan sesuai untuk pemula, tetapi sumber pembangunan depan tidak kaya dengan JavaScript. 2) Python berkuasa dalam bidang sains data dan perpustakaan pembelajaran mesin, sementara JavaScript lebih baik dalam perpustakaan pembangunan dan kerangka pembangunan depan. 3) Kedua -duanya mempunyai sumber pembelajaran yang kaya, tetapi Python sesuai untuk memulakan dengan dokumen rasmi, sementara JavaScript lebih baik dengan MDNWebDocs. Pilihan harus berdasarkan keperluan projek dan kepentingan peribadi.

Peralihan dari C/C ke JavaScript memerlukan menyesuaikan diri dengan menaip dinamik, pengumpulan sampah dan pengaturcaraan asynchronous. 1) C/C adalah bahasa yang ditaip secara statik yang memerlukan pengurusan memori manual, manakala JavaScript ditaip secara dinamik dan pengumpulan sampah diproses secara automatik. 2) C/C perlu dikumpulkan ke dalam kod mesin, manakala JavaScript adalah bahasa yang ditafsirkan. 3) JavaScript memperkenalkan konsep seperti penutupan, rantaian prototaip dan janji, yang meningkatkan keupayaan pengaturcaraan fleksibiliti dan asynchronous.

Enjin JavaScript yang berbeza mempunyai kesan yang berbeza apabila menguraikan dan melaksanakan kod JavaScript, kerana prinsip pelaksanaan dan strategi pengoptimuman setiap enjin berbeza. 1. Analisis leksikal: Menukar kod sumber ke dalam unit leksikal. 2. Analisis Tatabahasa: Menjana pokok sintaks abstrak. 3. Pengoptimuman dan Penyusunan: Menjana kod mesin melalui pengkompil JIT. 4. Jalankan: Jalankan kod mesin. Enjin V8 mengoptimumkan melalui kompilasi segera dan kelas tersembunyi, Spidermonkey menggunakan sistem kesimpulan jenis, menghasilkan prestasi prestasi yang berbeza pada kod yang sama.

Aplikasi JavaScript di dunia nyata termasuk pengaturcaraan sisi pelayan, pembangunan aplikasi mudah alih dan Internet of Things Control: 1. Pengaturcaraan sisi pelayan direalisasikan melalui node.js, sesuai untuk pemprosesan permintaan serentak yang tinggi. 2. Pembangunan aplikasi mudah alih dijalankan melalui reaktnatif dan menyokong penggunaan silang platform. 3. Digunakan untuk kawalan peranti IoT melalui Perpustakaan Johnny-Five, sesuai untuk interaksi perkakasan.

Saya membina aplikasi SaaS multi-penyewa berfungsi (aplikasi edTech) dengan alat teknologi harian anda dan anda boleh melakukan perkara yang sama. Pertama, apakah aplikasi SaaS multi-penyewa? Aplikasi SaaS Multi-penyewa membolehkan anda melayani beberapa pelanggan dari Sing

Artikel ini menunjukkan integrasi frontend dengan backend yang dijamin oleh permit, membina aplikasi edtech SaaS yang berfungsi menggunakan Next.Js. Frontend mengambil kebenaran pengguna untuk mengawal penglihatan UI dan memastikan permintaan API mematuhi dasar peranan

JavaScript adalah bahasa utama pembangunan web moden dan digunakan secara meluas untuk kepelbagaian dan fleksibiliti. 1) Pembangunan front-end: Membina laman web dinamik dan aplikasi satu halaman melalui operasi DOM dan kerangka moden (seperti React, Vue.js, sudut). 2) Pembangunan sisi pelayan: Node.js menggunakan model I/O yang tidak menyekat untuk mengendalikan aplikasi konkurensi tinggi dan masa nyata. 3) Pembangunan aplikasi mudah alih dan desktop: Pembangunan silang platform direalisasikan melalui reaktnatif dan elektron untuk meningkatkan kecekapan pembangunan.

Trend terkini dalam JavaScript termasuk kebangkitan TypeScript, populariti kerangka dan perpustakaan moden, dan penerapan webassembly. Prospek masa depan meliputi sistem jenis yang lebih berkuasa, pembangunan JavaScript, pengembangan kecerdasan buatan dan pembelajaran mesin, dan potensi pengkomputeran IoT dan kelebihan.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Penyesuai Pelayan SAP NetWeaver untuk Eclipse
Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular

Dreamweaver CS6
Alat pembangunan web visual

EditPlus versi Cina retak
Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod