PHPda xato va istisno qilishlarni qanday boshqarish mumkin?
sobes.tech AI
AIdan javob
PHPda xatoliklar va istisnolarni boshqarish dastur bajarilishini nazorat qilish, kritik nosozliklarni oldini olish va foydalanuvchiga ma'noli ma'lumotlar taqdim etish imkonini beradi.
Xatoliklar
Xatoliklar PHP interpretatori darajasida yuzaga keladigan muammolar. Ular sintaktik, mantiqiy yoki mavjud bo'lmagan resurslarga kirishda yuzaga kelishi mumkin. Xatolik darajalari (E_ERROR, E_WARNING, E_NOTICE va boshqalar) bilan belgilangan va error_reporting hamda display_errors yordamida sozlanishi mumkin.
Xatoliklarni boshqarish uchun set_error_handler() yordamida ro'yxatdan o'tgan foydalanuvchi funksiyalari ishlatiladi. Bu funksiya xatoliklarni (E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING bundan tashqari) ushlash, ularni yozib olish, xabar chiqarish, skriptni to'xtatish yoki davom ettirish imkonini beradi.
<?php
// Foydalanuvchi xatoliklarni boshqarish funksiyasi
function myErrorHandler($errno, $errstr, $errfile, $errline) {
// Xatolikni log qilish
error_log("Xato [$errno]: $errstr $errfile da $errline qatorida");
// Foydalanuvchiga xabar chiqarish (muhitga qarab)
if (ini_get('display_errors')) {
echo "Xatolik yuz berdi: [$errno] $errstr<br>";
echo "Faylda: $errfile, qator: $errline<br>";
}
// Kritikal xatolikda skriptni to'xtatish
if ($errno == E_USER_ERROR) {
die("Kritik xato. Skript to'xtatildi.");
}
// Standart PHP xatti-harakatini davom ettirish, agar funksiya false qaytarilsa
// return false;
}
// Xizmat funksiyasini ro'yxatdan o'tkazish
set_error_handler("myErrorHandler");
// Xatolik misoli
// echo $undeclaredVar; // E_NOTICE ni chaqiradi
Istisnolar
Istisnolar - bu obyektlar bo'lib, ular istisno holatlar yuzaga kelganda chiqariladi. Ular kodni tuzishga va bajarilayotgan oqimni boshqarishga an'anaviy xatoliklarni boshqarishdan ko'ra moslashuvchanroq imkoniyatlar yaratadi.
Istisnolar try...catch...finally konstruktsiyasi yordamida boshqariladi:
try: istisno yuzaga kelishi mumkin bo'lgan kod bloki.catch:tryyoki boshqacatchblokida chiqarilgan istisno turiga mos keladigan kod bloki. Bir nechtacatchishlatilishi mumkin.finally: (PHP 5.5 dan boshlab) har doim bajariladigan kod bloki, istisno chiqarilgan yoki chiqarilmagan bo'lsa ham.
<?php
function divide($a, $b) {
if ($b === 0) {
// Ichki Exception klassidan istisno chiqarish
throw new Exception("Nolga bo'lish mumkin emas.");
}
return $a / $b;
}
try {
// Istisno chiqarishi mumkin bo'lgan kodni bajarish
echo divide(10, 2) . "<br>";
echo divide(5, 0) . "<br>"; // bu yerda istisno chiqariladi
echo "Bu kod bajarilmaydi, agar yuqoridagi satr istisno chiqaradigan bo'lsa.";
} catch (Exception $e) {
// Istisnoni ushlash
echo "Ushlandi istisno: " . $e->getMessage() . "<br>";
// Fayl, satr va chaqiruvlar stekini olish mumkin
// echo "Fayl: " . $e->getFile() . " satr: " . $e->getLine() . "<br>";
// echo "Chaqiruvlar steki:<pre>" . $e->getTraceAsString() . "</pre>";
} finally {
// Bu blok har doim bajariladi
echo "Operatsiya yakunlandi.<br>";
}
Istisno sinflari
PHP Exception bazaviy sinfini taqdim etadi, undan InvalidArgumentException, RuntimeException kabi boshqa ichki istisno sinflari meros oladi. Maxsus istisno sinflarini yaratish uchun Exception yoki uning vorislari bilan meros olish mumkin, bu xatolik turlarini aniqroq ifodalash uchun.
<?php
class MyCustomException extends Exception {
// O'z xususiyatlar va metodlar qo'shish mumkin
}
function processData($data) {
if (empty($data)) {
// Foydalanuvchi istisnosini chiqarish
throw new MyCustomException("Bosh ma'lumotlar mavjud emas.");
}
// ... ma'lumotlarni qayta ishlash
}
try {
processData([]);
} catch (MyCustomException $e) {
echo "Ushlandi foydalanuvchi istisnosi: " . $e->getMessage() . "<br>";
} catch (Exception $e) {
// Boshqa istisno turlarini boshqarish
echo "Ushlandi boshqa istisno: " . $e->getMessage() . "<br>";
}
Umumiy prinsiplari
- Boshqara olmaydigan xatoliklarni ushlamang. Agar qanday to'g'ri javob berishni bilmasangiz, uni yuqoriga chiqarishga ruxsat bering.
- Istisnolar kutilyotgan, ammo noodatiy holatlar uchun mos keladi (masalan, foydalanuvchi kiritish xatosi, ma'lumotlar bazasiga ulanish imkoni). Xatoliklar esa odatda kod yoki muhitdagi muammolarni ko'rsatadi.
- Xatoliklar va istisnolarni log qiling. Bu debugging va monitoring uchun juda muhim.
- Xavfsiz ma'lumotlarni foydalanuvchiga oshkor qilmang.
set_exception_handler()yordamida kiritilmagan istisnolarni boshqaring. Bu kritik xatoliklarni oldini olish va barqarorlikni ta'minlash imkonini beradi.
<?php
// Kiritilmagan istisnolar uchun handler
function myExceptionHandler($exception) {
error_log("Kiritilmagan istisno: " . $exception->getMessage());
// Xato sahifasiga yo'naltirish, umumiy xabar chiqarish va boshqalar
echo "Serverda kutilmagan xato yuz berdi. Iltimos, keyinroq urinib ko'ring.";
}
set_exception_handler('myExceptionHandler');
// Bu kod istisno chiqaradi, u myExceptionHandler tomonidan ushlanadi
// throw new Exception("Bu kiritilmagan istisno.");
Shunday qilib, xatoliklar va istisnolarni to'g'ri boshqarish PHP ilovalarining ishonchliligi va qo'llab-quvvatlashini ta'minlash uchun muhimdir.