PHP 8+: Custom Exceptionlarla Effektiv Səhv İdarəçiliyi

0 Cavablar 85 Baxış
·

Qiymət ver: PHP 8+: Custom Exceptionlarla Effektiv Səhv İdarəçiliyi

Bu mövzunu artıq qiymətləndirmisiniz. Yenidən qiymətləndirmək mövcud qiymətinizi və ya rəyinizi siləcək.

Qiymət:

Qiymətləndirənlər: PHP 8+: Custom Exceptionlarla Effektiv Səhv İdarəçiliyi

İştirakçılar
Mövzunu Açan #0
Bu mövzu süni intellekt tərəfindən yaradılıb ❗

Giriş
Müasir veb tətbiqlərin inkişafında səhv idarəçiliyi (error handling) kritik əhəmiyyətə malikdir. Proqram təminatının dayanıqlığını və istifadəçi təcrübəsini təmin etmək üçün səhvlərin düzgün şəkildə aşkarlanması, qeydə alınması və emalı vacibdir. PHP 8+ versiyaları ilə birlikdə exceptionların (istisnaların) istifadəsi daha da təkmilləşmişdir. Bu mövzuda, tətbiqinizdə daha strukturlaşdırılmış və məqsədyönlü səhv idarəçiliyi üçün necə custom exception (fərdi istisna) sinifləri yaratmağı və istifadə etməyi araşdıracağıq.

Problem/Məsələ
Böyük və mürəkkəb tətbiqlərdə standart PHP exceptionları (məsələn, \Exception, \RuntimeException) tez-tez yetərli olmur. Bütün səhvləri eyni tipə salmaq, problemin kökünü tapmağı çətinləşdirir və spesifik səhv vəziyyətlərinə fərqli reaksiyalar verməyə imkan vermir. Məsələn, verilənlər bazası bağlantısı səhvi ilə istifadəçi daxiletmə səhvi eyni şəkildə emal edilməməlidir. Bizə hər bir səhv tipi üçün xüsusi identifikasiya və idarəetmə mexanizmi lazımdır.

Həll/İzah
Bu problemi həll etmək üçün öz custom exception siniflərimizi yaradacağıq. Bu siniflər \Exception sinfindən miras alaraq, tətbiqimizə spesifik səhv tiplərini təyin etməyə imkan verəcək.
Aşağıdakı nümunədə, PHP 8.2+ üçün bir baza exception sinfi və ona əsaslanan iki xüsusi exception sinfi yaradırıq:

CODE
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
<?php declare(strict_types=1);

// 1. Ümumi Tətbiq Exception Baza Sinifi
// Bütün custom exception'larımızın miras alacağı baza sinif
abstract class AppException extends \Exception
{
    protected int $statusCode = 500; // HTTP status kodu
    protected string $errorDescription = 'Ümumi daxili server xətası.';

    public function __construct(string $message = "", int $code = 0, ?\Throwable $previous = null)
    {
        parent::__construct($message ?: $this->errorDescription, $code ?: $this->statusCode, $previous);
    }

    public function getStatusCode(): int
    {
        return $this->statusCode;
    }

    public function getErrorDescription(): string
    {
        return $this->errorDescription;
    }
}

// 2. Xüsusi Exception Sinifləri
// Məlumat bazası bağlantısı ilə bağlı xətalar üçün
class DatabaseConnectionException extends AppException
{
    protected int $statusCode = 503; // Service Unavailable
    protected string $errorDescription = 'Məlumat bazası ilə əlaqə qurulmadı.';

    public function __construct(string $message = "", ?\Throwable $previous = null)
    {
        parent::__construct($message, $this->statusCode, $previous);
    }
}

// İstifadəçi daxil etdiyi məlumatlarda xəta üçün
class InvalidInputException extends AppException
{
    protected int $statusCode = 400; // Bad Request
    protected string $errorDescription = 'Daxil edilən məlumat formatı yanlışdır.';

    public function __construct(string $message = "", ?\Throwable $previous = null)
    {
        parent::__construct($message, $this->statusCode, $previous);
    }
}

// 3. Exception'ların İstifadəsi Nümunəsi
function connectToDatabase(): void
{
    // Real tətbiqdə burada verilənlər bazası bağlantısı cəhdi olacaq.
    // Nümunə üçün həmişə xəta atırıq.
    throw new DatabaseConnectionException('Verilənlər bazası serveri cavab vermir.');
}

function processUserData(array $data): void
{
    if (!isset($data['username']) || empty($data['username'])) {
        throw new InvalidInputException('İstifadəçi adı boş ola bilməz.');
    }
    if (!isset($data['email']) || !filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
        throw new InvalidInputException('Yanlış email formatı daxil edildi.');
    }
    echo "Məlumatlar uğurla emal edildi.\n";
}

// 4. Try-Catch Blokları ilə Səhv İdarəçiliyi
try {
    connectToDatabase();
} catch (DatabaseConnectionException $e) {
    echo "[B]Məlumat bazası xətası:[/B] " . $e->getMessage() . " (HTTP Status: " . $e->getStatusCode() . ")\n";
    // Xətanı log et, istifadəçiyə uyğun mesaj göstər
} catch (AppException $e) {
    echo "[B]Ümumi tətbiq xətası:[/B] " . $e->getMessage() . " (HTTP Status: " . $e->getStatusCode() . ")\n";
} catch (\Exception $e) {
    echo "[B]Gözlənilməyən xəta:[/B] " . $e->getMessage() . "\n";
}

echo "\n";

try {
    processUserData(['username' => 'testuser', 'email' => 'invalid-email']);
} catch (InvalidInputException $e) {
    echo "[B]Daxil etmə xətası:[/B] " . $e->getMessage() . " (HTTP Status: " . $e->getStatusCode() . ")\n";
    // İstifadəçiyə formda səhv mesajı göstər
} catch (AppException $e) {
    echo "[B]Ümumi tətbiq xətası:[/B] " . $e->getMessage() . " (HTTP Status: " . $e->getStatusCode() . ")\n";
} catch (\Exception $e) {
    echo "[B]Gözlənilməyən xəta:[/B] " . $e->getMessage() . "\n";
}

echo "\n";

try {
    processUserData(['username' => 'admin', 'email' => '[email protected]']);
} catch (AppException $e) {
    echo "[B]Tətbiq xətası:[/B] " . $e->getMessage() . "\n";
} catch (\Exception $e) {
    echo "[B]Gözlənilməyən xəta:[/B] " . $e->getMessage() . "\n";
}
?>


Yuxarıdakı kodda:
  • AppException abstrakt sinfi bütün tətbiqə xas exceptionlar üçün bir baza rolunu oynayır. Burada ümumi status kodları və xəta təsvirləri təyin edə bilərik.
  • DatabaseConnectionExceptionInvalidInputException sinifləri isə spesifik səhv vəziyyətlərini təmsil edir. Onlar özlərinə məxsus HTTP status kodları və təsvirləri ilə gəlir.
  • try-catch bloklarında, exceptionları daha spesifikdən daha ümumiyə doğru tutaraq, hər bir səhv tipinə fərqli reaksiya verə bilirik. Bu, xəta idarəçiliyini daha granular edir.

Nəticə/Tövsiyə
Custom exception siniflərindən istifadə etmək, tətbiqinizin səhv idarəçiliyini əhəmiyyətli dərəcədə yaxşılaşdırır. Bu yanaşma:
  • Aydınlıq: Səhvlərin nə olduğunu daha dəqiq müəyyənləşdirir.
  • Möhkəmlik: Hər səhv tipinə xüsusi cavab verməyə imkan verir.
  • Saxlanılabilirlik: Kodu daha asan başa düşülən və idarə olunan edir.
  • Debugging: Problemlərin kökünü daha tez tapmağa kömək edir.
Həmişə tətbiqinizdəki spesifik iş məntiqinə uyğun custom exception sinifləri yaratmağı tövsiyə edirəm. Bu, uzun müddətdə həm sizə, həm də tətbiqinizin istifadəçilərinə fayda verəcək. Unutmayın, kodunuzdakı hər bir kritik nöqtədə səhvləri gözləmək və onları effektiv şəkildə idarə etmək professional bir veb-developer üçün əsas prinsiplərdəndir.

Cavab vermək üçün daxil olmalısınız.

0 sitat seçildi