Pengecualian dilemparkan - mereka dimaksudkan untuk ditangkap. Kesalahan umumnya tidak dapat dipulihkan. Katakanlah misalnya - Anda memiliki blok kode yang akan memasukkan baris ke dalam database. Ada kemungkinan bahwa panggilan ini gagal (ID duplikat) - Anda akan mendapatkan "Error" yang dalam hal ini adalah "Exception". Saat Anda menyisipkan baris ini, Anda dapat melakukan sesuatu seperti ini
try {
$row->insert();
$inserted = true;
} catch (Exception $e) {
echo "There was an error inserting the row - ".$e->getMessage();
$inserted = false;
}
echo "Some more stuff";
Eksekusi program akan berlanjut - karena Anda 'menangkap' pengecualian. Pengecualian akan diperlakukan sebagai kesalahan kecuali itu tertangkap. Ini akan memungkinkan Anda untuk melanjutkan eksekusi program setelah gagal juga.
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 :-(Throwable
antarmuka baru ), memberikan cara yang jauh lebih ekspresif dan absolut untuk membedakan dan menangani keduanya dengan benar. masalah dan pesan nasihatError
VS keturunannyaException
.Saya biasanya
set_error_handler
ke fungsi yang mengambil kesalahan dan melempar pengecualian sehingga apa pun yang terjadi, saya hanya akan memiliki pengecualian untuk ditangani. Tidak ada lagi@file_get_contents
percobaan / tangkap yang bagus dan rapi.Dalam situasi debug saya juga memiliki penangan pengecualian yang mengeluarkan halaman seperti asp.net. Saya memposting ini di jalan tetapi jika diminta saya akan memposting sumber contoh nanti.
edit:
Selain seperti yang dijanjikan, saya telah memotong dan menempelkan beberapa kode saya bersama-sama untuk membuat sampel. Saya telah menyimpan di bawah ini ke file di workstation saya, Anda TIDAK LAGI dapat melihat hasilnya di sini (karena tautannya rusak).
sumber
Jawabannya pantas untuk membicarakan gajah di dalam ruangan
Error adalah cara lama menangani kondisi error pada saat run-time. Biasanya kode akan membuat panggilan ke sesuatu seperti
set_error_handler
sebelum menjalankan beberapa kode. Mengikuti tradisi interupsi bahasa assembly. Berikut adalah tampilan beberapa kode BASIC.Sulit untuk memastikan bahwa
set_error_handler
itu akan disebut dengan nilai yang tepat. Dan lebih buruk lagi, panggilan dapat dilakukan ke prosedur terpisah yang akan mengubah penanganan kesalahan. Ditambah berkali-kali panggilan diselingi denganset_error_handler
panggilan dan penangan. Mudah bagi kode untuk segera lepas kendali. Penanganan pengecualian datang untuk menyelamatkan dengan memformalkan sintaksis dan semantik dari apa yang sebenarnya dilakukan kode bagus.Tidak ada fungsi terpisah atau risiko memanggil penangan kesalahan yang salah. Kode sekarang dijamin berada di tempat yang sama. Ditambah kami mendapatkan pesan kesalahan yang lebih baik.
PHP dulunya hanya memiliki penanganan kesalahan, ketika banyak bahasa lain telah berevolusi ke model penanganan pengecualian yang lebih disukai. Akhirnya pembuat PHP menerapkan penanganan pengecualian. Tetapi cenderung mendukung kode lama, mereka tetap menangani kesalahan dan menyediakan cara untuk membuat penanganan kesalahan terlihat seperti penanganan pengecualian. Kecuali itu, tidak ada jaminan bahwa beberapa kode mungkin tidak mengatur ulang penangan kesalahan yang persis seperti yang dimaksudkan oleh penanganan pengecualian.
Jawaban akhir
Kesalahan yang dikodekan sebelum penanganan pengecualian diterapkan, kemungkinan masih merupakan kesalahan. Kesalahan baru kemungkinan merupakan pengecualian. Tetapi tidak ada desain atau logika yang merupakan kesalahan dan yang merupakan pengecualian. Itu hanya berdasarkan pada apa yang tersedia pada saat itu dikodekan, dan preferensi pemrogram yang mengkodekannya.
sumber
Satu hal yang perlu ditambahkan di sini adalah tentang menangani pengecualian dan kesalahan. Untuk tujuan pengembang aplikasi, baik kesalahan maupun pengecualian adalah "hal buruk" yang ingin Anda catat untuk mempelajari masalah yang dimiliki aplikasi Anda - sehingga pelanggan Anda memiliki pengalaman yang lebih baik dalam jangka panjang.
Jadi masuk akal untuk menulis penangan kesalahan yang melakukan hal yang sama seperti yang Anda lakukan untuk pengecualian.
sumber
Seperti yang dinyatakan dalam jawaban lain, mengatur penangan kesalahan ke pelempar pengecualian adalah cara terbaik untuk menangani kesalahan di PHP. Saya menggunakan penyiapan yang sedikit lebih sederhana:
Harap perhatikan
error_reporting()
cek yang harus disimpan@
operator bekerja. Juga, tidak perlu mendefinisikan pengecualian khusus, PHP memiliki satu kelas yang bagus untuk itu.Manfaat besar dari melempar pengecualian adalah bahwa pengecualian memiliki pelacakan tumpukan yang terkait dengannya, sehingga mudah untuk menemukan di mana masalahnya.
sumber
Re: "tapi apa sebenarnya perbedaan antara kesalahan dan pengecualian?"
Ada banyak jawaban bagus tentang perbedaan di sini. Saya hanya akan menambahkan sesuatu yang belum dibicarakan - kinerja. Secara khusus, ini untuk perbedaan antara melempar / menangani pengecualian dan menangani kode yang dikembalikan (berhasil atau beberapa kesalahan). Biasanya, di php artinya mengembalikan
false
ataunull
, tetapi bisa lebih detail seperti mengupload file: http://php.net/manual/en/features.file-upload.errors.php Anda bahkan dapat mengembalikan objek Exception !Saya telah melakukan beberapa kinerja yang berjalan dalam berbagai bahasa / sistem. Secara umum, penanganan pengecualian sekitar 10.000x lebih lambat daripada memeriksa kode pengembalian kesalahan.
Jadi, jika benar-benar, secara positif perlu menyelesaikan eksekusi bahkan sebelum dimulai - Anda kurang beruntung karena perjalanan waktu tidak ada. Tanpa perjalanan waktu, kode pengembalian adalah opsi tercepat yang tersedia.
Edit:
PHP sangat dioptimalkan untuk penanganan pengecualian. Tes dunia nyata menunjukkan bahwa melempar pengecualian hanya 2-10x lebih lambat daripada mengembalikan nilai.
sumber
Saya pikir jawaban yang Anda cari adalah itu;
Kesalahan adalah hal standar yang biasa Anda lakukan, seperti menggemakan $ variabel yang tidak ada.
Pengecualian hanya dari PHP 5 dan seterusnya dan datang saat berurusan dengan objek.
Sederhananya:
Pengecualian adalah kesalahan yang Anda dapatkan saat menangani objek. Pernyataan coba / tangkap memungkinkan Anda melakukan sesuatu tentang mereka, dan digunakan seperti pernyataan if / else. Coba lakukan ini, jika masalah, tidak masalah, lakukan ini.
Jika Anda tidak "menangkap" pengecualian, maka itu berubah menjadi kesalahan standar.
Kesalahan adalah kesalahan fundemental php yang biasanya menghentikan skrip Anda.
Coba / tangkap sering digunakan untuk membuat koneksi database seperti PDO, yang tidak masalah jika Anda ingin mengarahkan skrip atau melakukan sesuatu yang lain jika koneksi tidak berfungsi. Tetapi jika Anda hanya ingin menampilkan pesan kesalahan dan menghentikan skrip maka Anda tidak membutuhkannya, pengecualian yang tidak tertangkap berubah menjadi kesalahan yang fatal. Atau Anda juga dapat menggunakan pengaturan penanganan kesalahan di seluruh situs.
Semoga membantu
sumber
sumber
Pengecualian diberikan dengan sengaja oleh kode yang menggunakan lemparan, kesalahan ... tidak terlalu banyak.
Kesalahan muncul sebagai akibat dari sesuatu yang biasanya tidak ditangani. (Kesalahan IO, kesalahan TCP / IP, kesalahan referensi nol)
sumber
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.
sumber
Anda dapat menambahkan komentar ini
sumber
Setelah set_error_handler () didefinisikan, penanganan error mirip dengan Exception. Lihat kode di bawah ini:
sumber