


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
data-line-start="1"
>
// kod untuk langkah 1

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

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Pengendalian pengecualian fungsi dalam C++ amat penting untuk persekitaran berbilang benang untuk memastikan keselamatan benang dan integriti data. Pernyataan cuba-tangkap membolehkan anda menangkap dan mengendalikan jenis pengecualian tertentu apabila ia berlaku untuk mengelakkan ranap program atau rasuah data.

Pengendalian pengecualian dalam panggilan rekursif: Mengehadkan kedalaman rekursif: Mencegah limpahan tindanan. Gunakan pengendalian pengecualian: Gunakan pernyataan cuba-tangkap untuk mengendalikan pengecualian. Pengoptimuman rekursi ekor: elakkan limpahan tindanan.

Pengendalian pengecualian C++ membolehkan penciptaan rutin pengendalian ralat tersuai untuk mengendalikan ralat masa jalan dengan membuang pengecualian dan menangkapnya menggunakan blok cuba-tangkap. 1. Buat kelas pengecualian tersuai yang diperolehi daripada kelas pengecualian dan ganti kaedah what() 2. Gunakan kata kunci lontaran untuk membuang pengecualian 3. Gunakan blok cuba-tangkap untuk menangkap pengecualian dan nyatakan jenis pengecualian yang boleh; dikendalikan.

Pengendalian pengecualian dalam ungkapan Lambda C++ tidak mempunyai skopnya sendiri dan pengecualian tidak ditangkap secara lalai. Untuk menangkap pengecualian, anda boleh menggunakan sintaks menangkap ungkapan Lambda, yang membenarkan ungkapan Lambda menangkap pembolehubah dalam skop definisinya, membenarkan pengendalian pengecualian dalam blok cuba-tangkap.

Dalam C++ berbilang benang, pengendalian pengecualian mengikut prinsip berikut: ketepatan masa, keselamatan benang dan kejelasan. Dalam amalan, anda boleh memastikan keselamatan benang bagi kod pengendalian pengecualian dengan menggunakan mutex atau pembolehubah atom. Selain itu, pertimbangkan kemasukan semula, prestasi dan ujian kod pengendalian pengecualian anda untuk memastikan ia berjalan dengan selamat dan cekap dalam persekitaran berbilang benang.

Pengendalian pengecualian PHP: Memahami tingkah laku sistem melalui penjejakan pengecualian Pengecualian ialah mekanisme yang digunakan oleh PHP untuk mengendalikan ralat, dan pengecualian dikendalikan oleh pengendali pengecualian. Kelas pengecualian Exception mewakili pengecualian umum, manakala kelas Throwable mewakili semua pengecualian. Gunakan kata kunci lontaran untuk membuang pengecualian dan gunakan kenyataan cuba...tangkap untuk menentukan pengendali pengecualian. Dalam kes praktikal, pengendalian pengecualian digunakan untuk menangkap dan mengendalikan DivisionByZeroError yang mungkin dilemparkan oleh fungsi hitung() untuk memastikan bahawa aplikasi boleh gagal dengan anggun apabila ralat berlaku.

Dalam PHP, pengendalian pengecualian dicapai melalui percubaan, menangkap, akhirnya, dan membuang kata kunci. 1) blok percubaan mengelilingi kod yang boleh membuang pengecualian; 2) Blok tangkapan mengendalikan pengecualian; 3) Akhirnya Blok memastikan bahawa kod itu sentiasa dilaksanakan; 4) Lemparan digunakan untuk membuang pengecualian secara manual. Mekanisme ini membantu meningkatkan keteguhan dan mengekalkan kod anda.

Untuk mengoptimumkan prestasi pengendalian pengecualian dalam C++, empat teknik berikut boleh dilaksanakan: Elakkan balingan pengecualian yang tidak perlu. Gunakan kelas pengecualian ringan. Utamakan kelas kecekapan dan pengecualian reka bentuk yang mengandungi hanya maklumat yang diperlukan. Manfaatkan pilihan pengkompil untuk mencapai keseimbangan prestasi dan kestabilan terbaik.
