Sobes.tech
Junior

Чӣ тавр коркарди хато ва истисноҳо дар 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() . "</pre>";
} 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("Ин истиснои нопойман.");

Тавре ки мебинем, истифодаи дурусти механизмҳои коркарди хатогиҳо ва истисноҳо асоси эҷоди барномаҳои боэътимод ва нигоҳдошавӣ мебошад.