Rumah > pembangunan bahagian belakang > tutorial php > PHP Master | Pengecualian yang luar biasa

PHP Master | Pengecualian yang luar biasa

尊渡假赌尊渡假赌尊渡假赌
Lepaskan: 2025-02-25 08:30:09
asal
535 orang telah melayarinya

PHP Master | Exceptional Exceptions

mata teras

    Pengecualian PHP adalah kelas khas yang boleh dibuang dan ditangkap untuk menunjukkan peristiwa yang tidak dijangka. Tidak seperti kesilapan yang tidak dapat dipulihkan, pengecualian dimaksudkan untuk diproses oleh kod panggilan dan gelembung ke atas sepanjang rantaian pelaksanaan sehingga mereka ditangkap.
  • Perbezaan antara kesilapan dan pengecualian PHP adalah bahawa kesilapan tidak dapat dipulihkan dan berlaku dalam gelung pelaksanaan utama, menunjukkan bahawa terdapat masalah dengan kestabilan kod atau persekitaran; gelung pelaksanaan, dan tidak bermakna sistem tidak stabil.
  • Tidak semua situasi yang tidak berjaya memerlukan pengecualian untuk dibuang. Pengecualian harus dibuang hanya jika mereka benar -benar tidak dapat meneruskan pelaksanaan. Ini bermakna bahawa tindakan yang bukan operasi biasa atau standard, kelainan, menyimpang dari situasi yang normal dan dijangka.
  • Toping A General
  • bersamaan dengan mengatakan terdapat "masalah" dan kod itu tidak tahu apa yang sedang berlaku. Sebaliknya, pengecualian tersuai harus selalu dilemparkan untuk memaklumkan kod panggilan situasi semasa, dengan itu memberikan kawalan halus terhadap apa yang sedang berlaku. Exception
  • Blok penangkapan global adalah tahap tertinggi blok penangkapan, dan semua pengecualian yang menggelegak ke tahap itu mesti ditangkap. Ia harus menjadi satu -satunya pengendali pengecualian umum dalam kod pengeluaran. Pengendali lain mestilah khusus dan terhad kepada pengecualian yang tahu bagaimana untuk mengendalikan dan bertanggungjawab.
PHP 5 memperkenalkan mekanisme pengendalian pengecualian, kelas khas yang boleh dibuang dan ditangkap (berbanding dengan kesilapan yang dilemparkan) untuk menunjukkan peristiwa yang tidak dijangka. Tidak seperti kesilapan, pengecualian dimaksudkan untuk diproses oleh kod panggilan dan gelembung ke atas sepanjang rantaian pelaksanaan sehingga mereka ditangkap. Sebaik sahaja pengecualian dilemparkan, kod dalam skop semasa akan berhenti melaksanakan (jadi, tiada baris selepas pernyataan

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 "". Ini adalah satu -satunya sebab untuk pengendali pengecualian umum yang harus dijumpai dalam kod pengeluaran, yang menangkap setiap contoh kelas 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

  • Apakah tujuan pengendalian pengecualian PHP?
Pengendalian pengecualian PHP adalah mekanisme yang kuat yang membolehkan pemaju menghiasi kesilapan dan pengecualian yang mungkin berlaku semasa pelaksanaan program. Ia menyediakan cara untuk memindahkan kawalan dari satu bahagian program ke yang lain. Pengendalian pengecualian PHP digunakan untuk menukar aliran normal pelaksanaan kod apabila ralat tertentu berlaku. Ini boleh menjadikan kod lebih mudah dibaca dan dikendalikan kerana ia memisahkan kod pengendalian ralat dari logik program utama.

  • Bagaimanakah blok percubaan dalam kerja PHP?
Dalam PHP, blok percubaan digunakan 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. Sekiranya pengecualian dilemparkan ke dalam blok percubaan, skrip berhenti berjalan dan kawalan disalurkan ke blok tangkapan pertama yang sepadan dengan jenis pengecualian yang dibuang.

  • Apakah peranan akhirnya blok dalam pengendalian pengecualian PHP?
Akhirnya blok dalam pengendalian pengecualian PHP digunakan untuk memastikan bahawa sekeping kod sentiasa dilaksanakan, sama ada pengecualian dilemparkan atau tidak. Ini berguna untuk aktiviti pembersihan seperti penutup fail atau sambungan pangkalan data yang perlu dilakukan tanpa mengira kejayaan atau kegagalan operasi.

  • Bagaimana untuk membuat pengecualian tersuai dalam PHP?
Dalam PHP, anda boleh membuat pengecualian tersuai dengan memperluaskan kelas pengecualian terbina dalam. Ini membolehkan anda menambah fungsi tersuai kepada pengecualian, atau membuat pengecualian khusus domain aplikasi. Untuk membuat pengecualian tersuai, anda boleh menentukan kelas baru yang memanjangkan pengecualian dan kemudian menambah kaedah atau sifat tersuai yang anda inginkan.

  • Apakah perbezaan antara pengecualian dan kesilapan dalam PHP?
Dalam PHP, kesilapan adalah masalah serius yang menghalang skrip daripada berjalan, sementara pengecualian adalah keadaan yang mengubah proses pelaksanaan biasa. Kesilapan biasanya disebabkan oleh kesilapan sintaks atau memanggil fungsi yang tidak ditentukan. Sebaliknya, pengecualian sering digunakan untuk mengendalikan keadaan yang tidak membawa maut kepada program tetapi memerlukan pengendalian khas.

  • Bagaimana untuk mengendalikan pelbagai pengecualian dalam PHP?
Dalam PHP, anda boleh menggunakan pelbagai blok tangkapan untuk mengendalikan pelbagai pengecualian. Setiap blok tangkapan mengendalikan pengecualian jenis tertentu. Apabila pengecualian dilemparkan, blok tangkapan diperiksa dalam susunan yang muncul dalam kod. Blok tangkapan pertama yang mampu mengendalikan jenis pengecualian yang dibuang akan dilaksanakan.

  • Bolehkah saya membuang semula pengecualian dalam 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.

  • Bagaimana untuk merakam pengecualian dalam PHP?

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.

  • Apakah pdoException dalam php?

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.

  • Bagaimana untuk mengendalikan pengecualian yang tidak disengajakan dalam PHP?

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!

Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan