Saya bermaksud memberi Anda diskusi yang paling tidak biasa tentang pengendalian kesalahan.
Saya membangun penangan kesalahan yang sangat baik ke dalam bahasa bertahun-tahun yang lalu, dan meskipun beberapa nama telah berubah, prinsip pemrosesan kesalahan tetap sama saat ini. Saya memiliki OS multi-tasking yang dibuat khusus dan harus dapat memulihkan dari kesalahan data di semua level tanpa kebocoran memori, pertumbuhan tumpukan, atau crash. Jadi, berikut ini adalah pemahaman saya tentang bagaimana kesalahan dan pengecualian harus beroperasi dan bagaimana perbedaannya. Saya hanya akan mengatakan saya tidak memiliki pemahaman tentang bagaimana internal mencoba menangkap bekerja, jadi saya menebak-nebak.
Hal pertama yang terjadi di balik penutup untuk pemrosesan kesalahan adalah melompat dari satu status program ke status program lainnya. Bagaimana caranya? Saya akan membahasnya.
Secara historis, kesalahan lebih lama dan lebih sederhana, dan pengecualian lebih baru dan sedikit lebih kompleks serta mampu. Kesalahan berfungsi dengan baik sampai Anda perlu melampiaskannya, yang setara dengan menyerahkan masalah sulit kepada supervisor Anda.
Kesalahan bisa berupa angka, seperti nomor kesalahan, dan terkadang dengan satu atau beberapa string terkait. Misalnya jika terjadi kesalahan membaca file, Anda mungkin dapat melaporkannya dan mungkin gagal dengan baik. (Hay, ini adalah langkah maju dari sekadar menabrak seperti di masa lalu.)
Apa yang tidak sering dikatakan tentang pengecualian adalah bahwa pengecualian adalah objek yang dilapisi pada tumpukan pengecualian khusus. Ini seperti tumpukan kembali untuk aliran program, tetapi memegang status kembali hanya untuk percobaan dan tangkapan kesalahan. (Saya biasa menyebutnya ePush dan ePop, dan? Abort adalah lemparan bersyarat yang akan melakukan ePop dan memulihkan ke level itu, sedangkan Abort adalah mati atau keluar penuh.)
Di bagian bawah tumpukan adalah informasi tentang pemanggil awal, objek yang mengetahui tentang status saat percobaan luar dimulai, yang sering kali saat program Anda dimulai. Di atas itu, atau lapisan berikutnya pada tumpukan, dengan up menjadi anak-anak, dan di bawah menjadi orang tua, adalah objek pengecualian dari blok coba / tangkap dalam berikutnya.
Jika Anda mencoba dalam percobaan, Anda menumpuk percobaan dalam di atas percobaan luar. Ketika kesalahan terjadi dalam percobaan dalam dan baik tangkapan dalam tidak dapat menanganinya atau kesalahan dilemparkan ke percobaan luar, maka kontrol dilewatkan ke blok tangkapan luar (objek) untuk melihat apakah itu dapat menangani kesalahan, yaitu supervisor Anda.
Jadi apa yang sebenarnya dilakukan tumpukan kesalahan ini adalah untuk dapat menandai dan memulihkan aliran program dan status sistem, dengan kata lain, ini memungkinkan program untuk tidak merusak tumpukan yang kembali dan mengacaukan hal-hal untuk orang lain (data) ketika ada yang salah. Jadi itu juga menyimpan status sumber daya lain seperti kumpulan alokasi memori dan sehingga dapat membersihkannya ketika penangkapan selesai. Secara umum ini bisa menjadi hal yang sangat rumit, dan itulah sebabnya penanganan pengecualian seringkali lambat. Secara umum cukup banyak status yang perlu masuk ke blok pengecualian ini.
Jadi, semacam blok coba / tangkap menetapkan keadaan untuk dapat kembali jika semuanya menjadi kacau. Ini seperti orang tua. Ketika hidup kita kacau balau, kita bisa kembali ke pangkuan orang tua kita dan mereka akan baik-baik saja.
Kuharap aku tidak mengecewakanmu.
Errors are generally unrecoverable
<- sebenarnya, ini tidak benar.E_ERROR
danE_PARSE
merupakan dua kesalahan paling umum yang tidak dapat dipulihkan (ada beberapa kesalahan lainnya) tetapi sebagian besar kesalahan yang akan Anda lihat di dev dapat dipulihkan (E_NOTICE
,E_WARNING
et al). Sayangnya penanganan kesalahan PHP sangat berantakan - segala macam hal memicu kesalahan yang tidak perlu (sebagian besar fungsi sistem file, misalnya). Secara umum pengecualian adalah "cara OOP", tetapi sayangnya beberapa API OOP asli PHP menggunakan kesalahan alih-alih pengecualian :-(