Sobes.tech
Junior

PHP-də səhv və istisna işləmə necədir?

sobes.tech Süni İntellekt

AI-dan cavab

PHP-də səhvlərin və istisnaların idarə olunması proqramın icrasını düzgün şəkildə nəzarət etməyə imkan verir, kritik çökmələrin qarşısını alır və istifadəçiyə məntiqli məlumatlar təqdim edir.

Səhvlər

Səhvlər PHP interpretatorunun səviyyəsində baş verən problemlərdir. Onlar sintaktik, məntiqi və ya mövcud olmayan resurslara giriş zamanı baş verə bilər. Səhv səviyyələri (E_ERROR, E_WARNING, E_NOTICE və s.) ilə müəyyən edilir və error_reportingdisplay_errors vasitəsilə tənzimlənə bilər.

Səhvlərin idarə olunması üçün set_error_handler() ilə qeydiyyatdan keçmiş istifadəçi funksiyaları istifadə olunur. Bu funksiya səhvləri (E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING istisna olmaqla) ələ keçirərək qeydiyyata alır, mesaj göstərir, skripti dayandırır və ya davam etdirir.

<?php
// İstifadəçi səhv idarəetmə funksiyası
function myErrorHandler($errno, $errstr, $errfile, $errline) {
    // Səhvi qeyd et
    error_log("Səhv [$errno]: $errstr $errfile-də $errline sətirində");

    // İstifadəçiyə mesaj göstər (mühitə görə)
    if (ini_get('display_errors')) {
        echo "Səhv baş verdi: [$errno] $errstr<br>";
        echo "Faylda: $errfile, sətirdə: $errline<br>";
    }

    // Kritiki səhvlərdə skripti dayandır
    if ($errno == E_USER_ERROR) {
        die("Kritik səhv. Skript dayandırıldı.");
    }

    // Standart PHP işləməsinə davam et, əgər funksiya false qaytarırsa
    // return false;
}

// Handler funksiyasını qeydiyyatdan keçirmək
set_error_handler("myErrorHandler");

// Səhv nümunəsi
// echo $undeclaredVar; // E_NOTICE yaradacaq

İstisnalar

İstisnalar, istisna vəziyyətlər baş verdikdə atılan obyektlərdir. Onlar kodu strukturlaşdırmağa və icra axını ilə daha elastik idarə etməyə imkan verir, ənənəvi səhv idarəetməsindən daha üstündür.

İstisnalar try...catch...finally quruluşu ilə idarə olunur:

  • try: istisna baş verə biləcək kod bloku.
  • catch: try və ya digər catch blokunda atılmış müəyyən tipdəki istisnaları tutan kod bloku. Bir neçə catch müxtəlif tipdəki istisnalar üçün istifadə oluna bilər.
  • finally: (PHP 5.5-dən etibarən) həmişə icra olunan kod bloku, istisna atılıb-atılmamasından asılı olmayaraq.
<?php
function divide($a, $b) {
    if ($b === 0) {
        // Daxili Exception sinifindən istisna atılır
        throw new Exception("Sıfıra bölmək mümkün deyil.");
    }
    return $a / $b;
}

try {
    // İstisna atıla biləcək kodu icra etməyə cəhd
    echo divide(10, 2) . "<br>";
    echo divide(5, 0) . "<br>"; // burada istisna yaranacaq
    echo "Bu kod icra olunmayacaq, əgər yuxarıdakı satır istisna atarsa.";
} catch (Exception $e) {
    // İstisnayı tut
    echo "Yakalaşmış istisna: " . $e->getMessage() . "<br>";
    // Fayl, sətir və çağırışların yığını alına bilər
    // echo "Fayl: " . $e->getFile() . " sətir: " . $e->getLine() . "<br>";
    // echo "Yığın izləmə:<pre>" . $e->getTraceAsString() . "</pre>";
} finally {
    // Bu blok həmişə icra olunur
    echo "Əməliyyat tamamlandı.<br>";
}

İstisna sinifləri

PHP Exception əsas sinfi təqdim edir, ondan InvalidArgumentException, RuntimeException kimi daxili istisna sinfləri irsi alınır. Öz istisna sinflərinizi Exception və ya onun törəmələrindən irsi alaraq daha dəqiq xətaların növlərini ifadə edə bilərsiniz.

<?php
class MyCustomException extends Exception {
    // Öz xüsusiyyətlər və metodlar əlavə edilə bilər
}

function processData($data) {
    if (empty($data)) {
        // Öz istisnasını atırıq
        throw new MyCustomException("İşlənəcək məlumatlar yoxdur.");
    }
    // ... məlumatların işlənməsi
}

try {
    processData([]);
} catch (MyCustomException $e) {
    echo "Yakalaşmış özəl istisna: " . $e->getMessage() . "<br>";
} catch (Exception $e) {
    // Digər istisnaları idarə et
    echo "Yakalaşmış başqa istisna: " . $e->getMessage() . "<br>";
}

Ümumi prinsiplər

  • İdarə edə bilmədiyiniz səhvləri tutmayın. Əgər müəyyən bir səhvə düzgün reaksiya verə bilmirsinizsə, onu yuxarı səviyyəyə çıxarın.
  • İstisnalar gözlənilən, lakin istisna vəziyyətlər üçün daha uyğundur (məsələn, istifadəçi giriş xətası, verilənlər bazasına qoşulmanın mümkün olmaması). Səhvlər isə adətən kod və ya mühitdəki problemləri göstərir.
  • Səhvləri və istisnaları qeyd edin. Bu, debugging və monitorinq üçün çox vacibdir.
  • İstifadəçiyə həssas məlumatları açıqlamayın.
  • set_exception_handler() istifadə edərək qeydə alınmamış istisnaları idarə edin. Bu, kritik səhvlərin qarşısını alır və sistemin düzgün işləməsini təmin edir.
<?php
// Qeydə alınmamış istisna üçün handler
function myExceptionHandler($exception) {
    error_log("Qeydə alınmamış istisna: " . $exception->getMessage());
    // Xəta səhifəsinə yönləndirmə, ümumi mesaj göstərmə və s.
    echo "Serverdə gözlənilməz xəta baş verdi. Zəhmət olmasa, sonra yenidən cəhd edin.";
}

set_exception_handler('myExceptionHandler');

// Bu kod istisna atacaq və myExceptionHandler tərəfindən ələ alınacaq
// throw new Exception("Bu qeydə alınmamış istisnadır.");

Beləliklə, səhvlər və istisnaların düzgün istifadəsi PHP tətbiqlərinin etibarlılığı və baxımını asanlaşdırır.