mata teras
Exception
akan dilaksanakan), dan kawalan akan dikembalikan ke pengendali pengecualian yang sepadan pertama (menangkap blok, pengendali pengecualian yang dikonfigurasikan atau Pengendali pengecualian yang disediakan oleh bahasa). Pelaksanaan kod berterusan dari sana hanya apabila pengecualian ditangkap. Artikel ini tidak bertujuan untuk menjelaskan pengecualian di peringkat kemasukan, tetapi untuk memberi nasihat tentang cara menggunakan pengecualian dengan lebih baik. Sekiranya anda tidak pernah menggunakan pengecualian sebelum ini, anda mungkin perlu berunding throw
Ralat
bukan pengecualian
Anda mungkin belajar tentang pengecualian, tetapi anda mungkin tertanya -tanya tentang perbezaan antara kesilapan PHP dan pengecualian (adat). Logik sebenarnya sangat mudah: ralat tidak dapat dipulihkan, berlaku dalam gelung pelaksanaan utama, dan menunjukkan kestabilan alam sekitar. Sebagai contoh, jika anda cuba mengakses nilai skalar sebagai array dan menaikkan E_NOTICE
, ini bermakna terdapat masalah dengan kod anda. Tidak ada jaminan bahawa pelaksanaan berterusan adalah selamat. Keadaan ini tidak dapat diperbetulkan semasa pelaksanaan. Jika T_IF
dicetuskan oleh E_PARSE
yang tidak dijangka yang ditemui oleh parser, anda akan memahami bagaimana ini mempengaruhi kestabilan perkara. Sebaliknya, pengecualian boleh diperolehi semula, boleh (dan biasanya) berlaku di luar gelung pelaksanaan utama dan tidak menunjukkan kestabilan sistem. Ia adalah komponen yang mengatakan, "Saya tidak dapat menyelesaikan permintaan anda dengan input yang diberikan, jadi anda boleh mengendalikan maklumat tersebut." Jadi ia tidak dapat menyelesaikan arahan yang diberikan dengan nilai semasa. Ini tidak bermakna persekitaran anda tidak stabil, ini hanya bermakna bahawa kod anda perlu menyesuaikan panjang nilai dengan padding atau memotong. Kod anda boleh menangkap pengecualian ini, mengemas kini nilai, dan cuba lagi. LengthException
tidak semua pengecualian adalah pengecualian
Ini adalah salah satu soalan yang paling sukar untuk dijawab: Apa sebenarnya pengecualian perlu dibuang? Sudah tentu, pengecualian anda mesti mematuhi tiga peraturan dalam perenggan sebelumnya. Membuang pengecualian ketika menghadapi ingatan yang rosak adalah amalan yang sangat buruk. Kod anda harus membuang ralat sebaliknya supaya PHP dapat membatalkan secepat mungkin, kerana persekitaran membuktikan tidak selamat untuk meneruskan pelaksanaan. Walau bagaimanapun, walaupun kesilapan tidak perlu, tiada pengecualian diperlukan untuk semua situasi yang tidak berjaya. Maksudnya: tidak semua situasi yang tidak berjaya adalah pengecualian. Perkataan "tidak normal" merujuk kepada tindakan yang bukan operasi biasa atau standard, dan kelainan yang menyimpang dari situasi yang normal dan dijangka. Seorang bekas rakan sekerja pernah memberitahu saya pada waktu makan malam bahawa perkhidmatan XML/RPC yang digunakan oleh syarikat mereka direka, tulang belakang semua operasi yang dihadapi awam. Arkitek kemudian belajar tentang pengecualian dan kemudahan mereka dalam menunjukkan keadaan yang tidak berjaya. Pilar ini menyediakan fungsi log masuk tunggal sebagai tambahan kepada ciri-ciri lain. Daripada mengakses pangkalan data secara langsung, aplikasi Web menanyakan perkhidmatan XML/RPC, yang kemudiannya bertindak balas berdasarkan kedai data berpusat yang berfungsi semua aplikasi web. Apabila kelayakan yang sah disediakan, status yang berjaya akan dikembalikan. Apabila masalah berlaku, pengecualian dilemparkan dan mesej dipaparkan menunjukkan sebab kegagalan. Mudah ditangkap, anda boleh memaparkan mesej kepada pengguna dengan mesej ralat yang mencolok dan berkilat. Tetapi pengguna menyediakan nama pengguna dan/atau kata laluan yang salah benar -benar menyimpang dari jangkaan? Dalam projek saya, pengguna yang saya kendalikan tidak sempurna, mereka akan menaip atau melupakan perkara. Mendapatkan kelayakan yang salah adalah sangat biasa, lebih biasa daripada kelayakan yang sah. Kelayakan pengesahan adalah tingkah laku yang dijangkakan untuk log masuk ke sistem, jadi dalam kes ini, perkhidmatan XML/RPC harus mengembalikan status yang menunjukkan sama ada pengesahan itu berjaya atau tidak. Walaupun kelayakan gagal, proses pengesahan itu sendiri masih berjaya dilaksanakan. Jika proses pengesahan tidak dilaksanakan dengan betul, terdapat masalah lain. Mungkin kedai data tidak boleh diakses, atau sesuatu yang lain. Ia sangat luar biasa untuk sistem log masuk yang tidak dapat disambungkan ke datastore mereka kerana ia tidak dapat berjalan tanpa datastores. Oleh itu, ini memerlukan membuang pengecualian. Nota: Sesetengah orang mungkin berpendapat bahawa sistem log masuk gagal menyambung ke kedai data adalah tanda bahawa persekitaran tidak stabil dan oleh itu harus menimbulkan kesilapan. Walau bagaimanapun, log masuk ke sistem tidak bertanggungjawab untuk menimbulkan ralat untuk penyimpanan data. Sebaliknya, jika penyambung penyimpanan data/pembungkus dianggap perlu, ralat perlu dibangkitkan. Secara umumnya, anda boleh memikirkan pengecualian sebagai situasi di mana pemaju perlu melangkah, melihat, dan mengendalikannya. Kod yang berlaku dengan senario pengecualian tidak dapat melakukan ini dengan sendirinya. Ini mungkin pemaju telah melihat kod dan cara mereka mengendalikannya adalah untuk membiarkannya berlaku apabila ia berlaku. Jangan mula menghantar e -mel kepada semua pengecualian ke pusat operasi rangkaian; Mengendalikan apa yang anda boleh dan harus mengendalikan dan pengecualian hanya dibuang jika ia benar -benar tidak dapat meneruskan pelaksanaan.
"Masalah"
Beberapa tahun yang lalu, ketika saya sedang mendaki melalui Eropah, saya tersandung pada pemandangan yang tidak dapat dilupakan di stesen kereta api di Greece. Salah satu kawasan loker kelihatan seperti bom meletup, dengan pintu tersebar di atas tanah, separuh tergantung pada engsel, atau dihancurkan. Saya kemudian mengetahui bahawa mereka telah mengeluarkan kawasan loker, tetapi perlu diperhatikan bagaimana mereka berkomunikasi kepada pelanggan bahawa kawasan ini telah dinyahaktifkan. Terdapat banyak pita di bahagian tengah, dengan sekeping kertas yang menampalnya dengan kata -kata "masalah". Secara teknikal, ini betul -betul betul. Terdapat jelas sesuatu yang salah dengan loker dan situasi itu ditangani dengan menyampaikannya kepada pelanggan. Anda mungkin merasa menarik, tetapi sebenarnya anda melihat ini sering dalam kod anda. Jika anda hanya membuang Exception
, anda pada dasarnya mengatakan "masalah" dan kod itu tidak tahu apa yang sedang berlaku. Walaupun Exception
adalah kelas asas untuk setiap pengecualian, anda boleh melanjutkannya dengan jenis anda sendiri. Pengumpulan pengecualian yang lebih luas boleh didapati di perpustakaan SPL, tetapi ini jauh dari had. Melihat kerangka PHP utama seperti Rangka Kerja Zend atau Symfony, anda akan mendapati bahawa mereka menggunakan pengecualian tersuai untuk hampir setiap situasi yang berbeza. Ia agak rumit untuk menulis semua fail ini supaya mereka boleh dimuatkan secara dinamik dan mengekalkan semua jenis yang berbeza, tetapi ini memberikan kawalan halus ke atas apa yang berlaku untuk rangka kerja dan pengguna rangka kerja itu. Jika anda hanya membuang Exception
, maka anda hanya boleh memastikan bahawa ada sesuatu yang salah dan anda mungkin juga berputus asa. Ini bermakna anda menggunakan pengecualian cara mereka adalah kesilapan, menggunakan blok penangkapan sebagai pengendali senyap, dan hanya melepaskan harapan bahawa seseorang dapat membetulkan keadaan ini dalam beberapa cara.
Global Capture
Jika ia adalah idea yang tidak baik untuk menggunakan pengecualian bukan adat dan menangkap semua pengecualian yang mungkin, maka mengapa bahasa itu membenarkan ini? Terdapat satu pengecualian kepada peraturan yang selalu menggunakan dan menangkap pengecualian khusus, iaitu peraturan penangkapan global. Blok penangkapan global adalah blok penangkapan peringkat tertinggi dan mesti menangkap semua pengecualian yang menggelegak ke tahap itu. PHP sendiri mengandungi A (adakah anda melihat "kesilapan maut: pengecualian yang tidak diketahui dalam ..." mesej?), Tetapi anda boleh mengatasinya dengan pengendali adat untuk berfungsi sebagai sandaran. Anda boleh menetapkan pengendali ini dengan fungsi set_exception_handler()
, jadi anda boleh melakukannya seperti yang anda suka dan menambah peraturan pada peraturan phpmd anda yang melarang garis seperti "catch (Exception $e) {
yang belum ditangkap. Pengendali lain mestilah khusus dan terhad kepada pengecualian yang tahu bagaimana untuk mengendalikan dan bertanggungjawab. Berhati -hati di sini, membiarkan pengecualian yang boleh dibelenggu sekali (dan kemudian membetulkannya dalam kod) pasti lebih baik daripada menangkap terlalu banyak dan bertindak sebagai pengendali senyap. Exception
Ringkasan Singkat Hanya menangkap pengecualian yang anda boleh dan harus mengendalikan. Ini akan menjadikan komponen anda kurang seperti kotak hitam (pengecualian adat) dan mengurangkan kemungkinan pemaju yang mengintegrasikan komponen anda mesti mengubah kod anda (jangan menangkap pengecualian yang tidak seharusnya). Kami sentiasa memberitahu pelanggan/pengurus kami untuk menjadi spesifik, tetapi kami juga harus khusus!
(gambar dari fotolia)
soalan yang sering ditanya mengenai pengendalian pengecualian php
Ya, anda boleh membuang semula pengecualian dalam PHP. Ini sangat berguna jika anda ingin mengendalikan pengecualian entah bagaimana tetapi ingin mempunyai tahap pengecualian yang lebih tinggi menangkapnya. Untuk melemparkan semula pengecualian, hanya gunakan pernyataan lemparan di blok tangkapan.
Dalam php, anda boleh log pengecualian dengan menggunakan fungsi error_log dalam blok tangkapan. Ini membolehkan anda log maklumat mengenai pengecualian, termasuk mesej dan jejak timbunannya, ke dalam fail log yang ditentukan.
PDOException adalah pengecualian yang dilemparkan apabila ralat berlaku dalam operasi PDO. PDO (Objek Data PHP) adalah lapisan abstraksi pangkalan data yang menyediakan antara muka yang konsisten untuk mengakses pangkalan data dalam PHP. PDOException memberikan maklumat mengenai kesilapan, termasuk kod ralat SQLState dan mesej ralat untuk pemacu pangkalan data.
Dalam PHP, anda boleh mengendalikan pengecualian yang tidak diketahui dengan menentukan fungsi pengendali pengecualian tersuai dan kemudian menetapkannya sebagai pengendali pengecualian lalai menggunakan fungsi set_exception_handler. Fungsi ini dipanggil setiap kali pengecualian yang tidak ditangkap oleh blok cubaan cuba dilemparkan.
Atas ialah kandungan terperinci PHP Master | Pengecualian yang luar biasa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!