Sobes.tech
Junior

Kā PHP tiek apstrādātas kļūdas un izņēmumi?

sobes.tech AI

Atbilde no AI

Kļūdu un izņēmumu apstrāde PHP ļauj kontrolēt programmas izpildi, ja rodas neatbilstības situācijas, novērst fatālas kļūdas un sniegt lietotājam jēgpilnu informāciju:

Kļūdas

Kļūdas — tas ir problēmas, kas rodas PHP interpretatora līmenī. Tās var būt sintaktiskas, loģiskas vai rasties, piekļūstot neeksistējošiem resursiem. Kļūdu līmeņi ir noteikti ar konstantiem (E_ERROR, E_WARNING, E_NOTICE un citi) un var tikt konfigurēti ar error_reporting un display_errors:

Kļūdu apstrādei tiek izmantotas lietotāja definētas funkcijas-apstrādātāji, kas reģistrēti ar set_error_handler(). Šī funkcija pārtrauc kļūdas (izņemot E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING), ļauj tās reģistrēt, rādīt ziņojumu, pārtraukt skriptu vai to turpināt:

<?php
// Lietotāja definēta kļūdu apstrādes funkcija
function myErrorHandler($errno, $errstr, $errfile, $errline) {
    // Kļūdas reģistrēšana
    error_log("Kļūda [$errno]: $errstr failā $errfile rindā $errline");

    // Ziņojuma rādīšana lietotājam (atkarībā no vides)
    if (ini_get('display_errors')) {
        echo "Notikusi kļūda: [$errno] $errstr<br>";
        echo "Failā: $errfile rindā: $errline<br>";
    }

    // Kritiskām kļūdām pārtraukt skriptu
    if ($errno == E_USER_ERROR) {
        die("Kritiska kļūda. Skripts pārtraukts.");
    }

    // Turpināt standarta PHP apstrādi, ja funkcija atgriež false
    // return false;
}

// Apstrādes funkcijas reģistrācija
set_error_handler("myErrorHandler");

// Piemēra kļūda
// echo $undeclaredVar; // Izraisīs E_NOTICE

Ekstremālas situācijas

Ekstremālas situācijas — tas ir objekti, kas tiek izmesti, kad rodas izņēmuma situācija. Tie ļauj strukturēt kodu un vadīt izpildi elastīgāk nekā tradicionālā kļūdu apstrāde:

Ekstremālas situācijas tiek apstrādātas ar try...catch...finally:

  • try: Koda bloks, kurā var rasties izņēmums.
  • catch: Kods, kas tiek izpildīts, ja try vai citā catch blokā ir izsviests izņēmums noteiktā tipa. Var izmantot vairākus catch blokus dažādiem izņēmumu tipiem.
  • finally: (pieejams no PHP 5.5) Kods, kas tiek izpildīts vienmēr, neatkarīgi no tā, vai ir izsviests izņēmums un vai tas ir notverts.
<?php
function divide($a, $b) {
    if ($b === 0) {
        // Izmet `Exception` klases izņēmumu
        throw new Exception("Dalīšana ar nulli nav iespējama.");
    }
    return $a / $b;
}

try {
    // Mēģinājums izpildīt kodu, kas var izsaukt izņēmumu
    echo divide(10, 2) . "<br>";
    echo divide(5, 0) . "<br>"; // Šeit tiks radīts izņēmums
    echo "Šis kods netiks izpildīts, ja iepriekšējais izsaucis izņēmumu.";
} catch (Exception $e) {
    // Izņēmuma notveršana
    echo "Notverts izņēmums: " . $e->getMessage() . "<br>";
    // Var arī iegūt failu, rindu un steku
    // echo "Failā: " . $e->getFile() . " rindā: " . $e->getLine() . "<br>";
    // echo "Steks:<pre>" . $e->getTraceAsString() . "</pre>";
} finally {
    // Šis bloks vienmēr tiek izpildīts
    echo "Operācija pabeigta.<br>";
}

Izņēmumu klases

PHP nodrošina pamata Exception klasi, no kuras manto citas iebūvētas izņēmumu klases (piemēram, InvalidArgumentException, RuntimeException). Var izveidot savas izņēmumu klases, mantojot no Exception vai tās pēcnācējiem, lai precīzāk atspoguļotu kļūdu tipus:

<?php
class MyCustomException extends Exception {
    // Var pievienot savas īpašības un metodes
}

function processData($data) {
    if (empty($data)) {
        // Izmet lietotāja definētu izņēmumu
        throw new MyCustomException("Dati nav pieejami.");
    }
    // ... datu apstrāde
}

try {
    processData([]);
} catch (MyCustomException $e) {
    echo "Notverts lietotāja definēts izņēmums: " . $e->getMessage() . "<br>";
} catch (Exception $e) {
    // Apstrādā citus izņēmumu tipus
    echo "Notverts cits izņēmums: " . $e->getMessage() . "<br>";
}

Kopējie principi

  • Neklausieties kļūdas, kuras nevarat apstrādāt. Ja nezināt, kā pareizi reaģēt uz konkrētu kļūdu, ļaujiet tai iziet augšup, lai to apstrādātu cits apstrādātājs:
  • Izņēmumu apstrāde ir piemērotāka gaidāmiem, bet izņēmuma rakstura gadījumiem (piemēram, lietotāja ievades kļūda, datu bāzes savienojuma neiespējamība). Kļūdas bieži norāda uz problēmām kodā vai vidē:
  • Reģistrējiet kļūdas un izņēmumus. Tas ir kritiski svarīgi atkļūdošanai un uzraudzībai:
  • Nepalieciet sensitīvu informāciju lietotājam kļūdu ziņojumos.
  • Izmantojiet set_exception_handler() nepārvaldītu izņēmumu apstrādei. Tas ļauj novērst fatālas kļūdas un nodrošina gludu kritumu pārvaldību:
<?php
// Nepārvaldītu izņēmumu apstrādātājs
function myExceptionHandler($exception) {
    error_log("Nepārvaldīts izņēmums: " . $exception->getMessage());
    // Pāradresēšana uz kļūdas lapu, kopēja ziņojuma rādīšana utt.
    echo "Notikusi neparedzēta kļūda serverī. Mēģiniet vēlreiz vēlāk.";
}

set_exception_handler('myExceptionHandler');

// Šis kods izmetīs izņēmumu, kas tiks notverts myExceptionHandler
// throw new Exception("Tas nav pārvaldīts izņēmums.");

Tādējādi, pareiza kļūdu un izņēmumu mehānismu izmantošana ir pamats uzticamu un uzturamu PHP lietojumprogrammu izstrādei.