Sobes.tech
Junior

Kuo skiriasi klaidų ir išimčių apdorojimas PHP?

sobes.tech AI

Atsakymas iš AI

Klaidų ir išimčių apdorojimas PHP leidžia kontroliuoti programos vykdymą, kai kyla netinkamos situacijos, užkirsti kelią fatališkoms klaidoms ir pateikti prasmingą informaciją naudotojui:

Klaidos

Klaidos – tai problemos, kurios kyla PHP interpretatoriaus lygyje. Jos gali būti sintaksės, loginės arba atsirasti prieinant prie neegzistuojančių išteklių. Klaidos lygiai nustatomi konstantų (E_ERROR, E_WARNING, E_NOTICE ir kt.) ir gali būti konfigūruojami naudojant error_reporting ir display_errors:

Klaidų apdorojimui naudojamos naudotojo apibrėžtos funkcijos-apdorotojai, registruojami per set_error_handler(). Ši funkcija perima klaidas (išskyrus E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING), leidžia jas registruoti, rodyti pranešimą, sustabdyti skriptą ar jį tęsti:

<?php
// Naudotojo apibrėžta klaidų apdorojimo funkcija
function myErrorHandler($errno, $errstr, $errfile, $errline) {
    // Klaidos registravimas
    error_log("Klaida [$errno]: $errstr faile $errfile eilutėje $errline");

    // Pranešimo rodymas naudotojui (priklausomai nuo aplinkos)
    if (ini_get('display_errors')) {
        echo "Įvyko klaida: [$errno] $errstr<br>";
        echo "Faile: $errfile eilutėje: $errline<br>";
    }

    // Kritinėms klaidoms sustabdyti skriptą
    if ($errno == E_USER_ERROR) {
        die("Kritinė klaida. Skriptas sustabdytas.");
    }

    // Tęsti standartinį PHP apdorojimą, jei funkcija grąžina false
    // return false;
}

// Apdorojimo funkcijos registravimas
set_error_handler("myErrorHandler");

// Pavyzdinė klaida
// echo $undeclaredVar; // Sukels E_NOTICE

Ekstremalios situacijos

Ekstremalios situacijos – tai objektai, kurie išmetami, kai kyla išskirtinės situacijos. Jie leidžia struktūruoti kodą ir valdyti vykdymo srautą lankstesnį nei tradicinė klaidų apdorojimas:

Ekstremalios situacijos apdorojamos naudojant try...catch...finally:

  • try: Kodo blokas, kuriame gali įvykti išimtis.
  • catch: Kodo blokas, kuris vykdomas, jei try arba kitas catch blokas išmetė išimtį nurodyto tipo. Gali būti keli catch blokai skirtingų tipų išimtims.
  • finally: (pasiekiama nuo PHP 5.5) Kodo blokas, kuris vykdomas visada, nepriklausomai nuo to, ar išimtis buvo išmesta ir ar ji buvo pagauta.
<?php
function divide($a, $b) {
    if ($b === 0) {
        // Išmetame `Exception` klasės išimtį
        throw new Exception("Dalyba iš nulio neįmanoma.");
    }
    return $a / $b;
}

try {
    // Bandymas vykdyti kodą, kuris gali išmesti išimtį
    echo divide(10, 2) . "<br>";
    echo divide(5, 0) . "<br>"; // Čia bus sugeneruota išimtis
    echo "Šis kodas nebus vykdomas, jei ankstesnė išimtis išmetė.";
} catch (Exception $e) {
    // Išimties pagavimas
    echo "Pagauta išimtis: " . $e->getMessage() . "<br>";
    // Taip pat galima gauti failą, eilutę ir steką
    // echo "Failas: " . $e->getFile() . " eilutė: " . $e->getLine() . "<br>";
    // echo "Stekas:<pre>" . $e->getTraceAsString() . "</pre>";
} finally {
    // Šis blokas visada vykdomas
    echo "Operacija baigta.<br>";
}

Išimtinių klasių

PHP siūlo bazinį Exception klasę, nuo kurios paveldi kitos įmontuotos išimtinių klasių (pvz., InvalidArgumentException, RuntimeException). Galite kurti savo išimtinių klasių, paveldėdami iš Exception ar jos palikuonių, kad tiksliau atitiktų klaidų tipus:

<?php
class MyCustomException extends Exception {
    // Galite pridėti savo savybių ir metodų
}

function processData($data) {
    if (empty($data)) {
        // Išmetame naudotojo sukurtą išimtį
        throw new MyCustomException("Duomenys nėra.");
    }
    // ... duomenų apdorojimas
}

try {
    processData([]);
} catch (MyCustomException $e) {
    echo "Pagauta naudotojo sukurtas išimtis: " . $e->getMessage() . "<br>";
} catch (Exception $e) {
    // Apdorojame kitų tipų išimtis
    echo "Pagauta kita išimtis: " . $e->getMessage() . "<br>";
}

Bendrieji principai

  • Neklausykite klaidų, kurias negalite apdoroti. Jei nežinote, kaip tinkamai reaguoti į konkretų klaidą, leiskite jai būti aukščiau ir apdoroti kitu būdu:
  • Išimtinių situacijų tvarkymas yra tinkamesnis, kai jos yra numatomos, bet išimtinos (pvz., naudotojo įvedimo klaida, duomenų bazės prisijungimo nesėkmė). Klaidos dažnai rodo problemą pačiame kode ar aplinkoje:
  • Log'uokite klaidas ir išimtis. Tai kritiška diegimui ir stebėsenai:
  • Neleiskite jautrios informacijos naudotojui matyti klaidų pranešimuose.
  • Naudokite set_exception_handler() apdoroti nepagaunamas išimtis. Tai leidžia išvengti fatališkų klaidų ir užtikrinti sklandų gedimo valdymą:
<?php
// Nepagaunamų išimčių apdorotojas
function myExceptionHandler($exception) {
    error_log("Nepagaunama išimtis: " . $exception->getMessage());
    // Nukreipimas į klaidos puslapį, bendro pranešimo rodymas ir kt.
    echo "Įvyko nenumatyta klaida serveryje. Bandykite vėliau.";
}

set_exception_handler('myExceptionHandler');

// Šis kodas išmes išimtį, kuri bus pagauta myExceptionHandler
// throw new Exception("Tai nepagaunama išimtis.");

Taigi, tinkamas klaidų ir išimčių mechanizmų naudojimas yra pagrindas kurti patikimas ir palaikomas PHP programas.