PHPда каталар жана исключенияларды иштетүү кандай болот?
sobes.tech AI
AIден жооп
PHP-деги каталар жана кырдаалдар иштетүү программаны туура эмес кырдаалдар пайда болгондо көзөмөлдөөгө, фаталдык каталарды алдын алууга жана колдонуучуга маанилүү маалымат берүүгө мүмкүндүк берет:
Каталар
Каталар — бул PHP интерпретаторунун деңгээлинде пайда болгон көйгөйлөр. Алар синтаксистик, логикалык болушу мүмкүн же бар болбогон ресурстарга жетүүдө пайда болушу мүмкүн. Каталардын деңгээлдери константтар аркылуу аныкталган (E_ERROR, E_WARNING, E_NOTICE жана башка) жана error_reporting жана display_errors аркылуу жөнгө салынат:
Каталарды иштетүү үчүн колдонуучу аныктаган функциялар-иштетүүчүлөр колдонулат, алар set_error_handler() аркылуу катталат. Бул функция каталарды (E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING тышкары) кармайт, аларды каттоо, билдирүү көрсөтүү, скриптти токтотуу же улантуу мүмкүнчүлүгүн берет:
<?php
// Колдонуучу аныктаган каталарды иштетүүчү функция
function myErrorHandler($errno, $errstr, $errfile, $errline) {
// Катаны логдоо
error_log("Каталар [$errno]: $errstr файлда $errfile сапта $errline");
// Колдонуучуга билдирүү көрсөтүү (чөйрөгө жараша)
if (ini_get('display_errors')) {
echo "Каталар пайда болду: [$errno] $errstr<br>";
echo "Файлда: $errfile сапта: $errline<br>";
}
// Критикалык каталарда скриптти токтотуу
if ($errno == E_USER_ERROR) {
die("Критикалык каталар. Скрипт токтотулду.");
}
// Стандарт PHP иштетүүнү улантуу, эгер функция false кайтарса
// return false;
}
// Иштетүүчү функцияны каттоо
set_error_handler("myErrorHandler");
// Мисал катасы
// echo $undeclaredVar; // E_NOTICE пайда кылат
Кырдаалдар
Кырдаалдар — бул объекттер, алар кырдаал пайда болгондо ыргытышат. Алар кодду структуралаштырып, иштетүү агымын ийкемдүү башкарууга мүмкүндүк берет, салттуу каталарга караганда:
Кырдаалдар try...catch...finally структурасы менен иштетилет:
try: Котормо, анда кырдаал пайда болушу мүмкүн.catch: Котормо, алtryже башкаcatchблокунда белгиленген түрдөгү кырдаал ыргытыла турган болсо ишке ашат. Бир нечеcatchблоктору ар кандай кырдаалдар үчүн колдонулушу мүмкүн:finally: (PHP 5.5тен баштап жеткиликтүү) Котормо, ал ар дайым ишке ашат, кырдаал ыргытылабы же жокпу жана ал кармалганбы же жокпу айырмаланбайт:
<?php
function divide($a, $b) {
if ($b === 0) {
// `Exception` классынын ички кырдаалын ыргытуу
throw new Exception("Зер буюу бөлүү мүмкүн эмес.");
}
return $a / $b;
}
try {
// Көчүрүү, анда кырдаал пайда болушу мүмкүн
echo divide(10, 2) . "<br>";
echo divide(5, 0) . "<br>"; // Мында кырдаал пайда болот
echo "Бул код ишке ашпайт, эгер ал мурдагы кырдаал пайда кылса.";
} catch (Exception $e) {
// Кырдаалды кармоо
echo "Каралган кырдаал: " . $e->getMessage() . "<br>";
// Файлды, сапты жана стекти алууга болот
// echo "Файл: " . $e->getFile() . " сап: " . $e->getLine() . "<br>";
// echo "Стек: " . $e->getTraceAsString() . "<br>";
} finally {
// Бул блок ар дайым ишке ашат
echo "Операция аяктады.<br>";
}
Кырдаалдар класстары
PHP негизги Exception класын сунуштайт, анын негизинде башка ички кырдаал класстары (мисалы, InvalidArgumentException, RuntimeException) мурас алат. Өзгөчө кырдаал класстарын түзүү үчүн Exception же анын мурас класстарынан мурас алса болот, каталардын түрлөрүн так көрсөтүү үчүн:
<?php
class MyCustomException extends Exception {
// Өзүнүн касиеттерин жана методдорун кошсо болот
}
function processData($data) {
if (empty($data)) {
// Колдонуучу аныктаган кырдаалды ыргытуу
throw new MyCustomException("Өңдөөгө маалыматтар жок.");
}
// ... маалыматтарды иштетүү
}
try {
processData([]);
} catch (MyCustomException $e) {
echo "Колдонуучу аныктаган кырдаал кармалды: " . $e->getMessage() . "<br>";
} catch (Exception $e) {
// Башка кырдаалдарды иштетүү
echo "Башка кырдаал кармалды: " . $e->getMessage() . "<br>";
}
Жалпы принциптер
- Көрө албаган каталарды кармаңыз. Эгер конкреттүү катаны туура иштетүү жолун билбесеңиз, аны жогорулап коюңуз:
- Кырдаалдар күтүлгөн, бирок уникалдуу учурлар үчүн ылайыктуу (мисалы, колдонуучунун киргизүү катасы, БДга туташуу мүмкүн эместиги). Каталар көбүнесе код же чөйрө көйгөйлөрүн көрсөтөт:
- Каталар жана кырдаалдар жөнүндө лог жүргүзүңүз. Бул ката жана мониторинг үчүн маанилүү:
- Кулпуланган билдирүүлөрдө сезгич маалыматтарды ачпаңыз.
set_exception_handler()колдонуп, кармалбаган кырдаалдарды иштетүү. Бул фаталдык каталардын алдын алууга жана жумшак түшүшүүгө мүмкүндүк берет:
<?php
// Кармалбаган кырдаалдар үчүн иштетүүчү
function myExceptionHandler($exception) {
error_log("Кармалбаган кырдаал: " . $exception->getMessage());
// Каталар баракчасына которуу, жалпы билдирүү көрсөтүү жана башка
echo "Серверде күтүлбөгөн ката пайда болду. Кийинки аракеттерди көрүңүз.";
}
set_exception_handler('myExceptionHandler');
// Бул код кырдаалды ыргыта турган болсо, ал myExceptionHandler тарабынан кармалат
// throw new Exception("Бул кармалбаган кырдаал.");
Ошентип, каталар жана кырдаалдар механизмдерин туура колдонуу ишенимдүү жана оңдоого оңой PHP тиркемелерин түзүүнүн негизги бөлүгү болуп саналат.