Gestionarea Modernă a Erorilor și Excepțiilor în PHP 8: Throwable și Excepții în PHP

Erori și excepții PHP 8.x Error Handling

Ierarhia Throwable în PHP: diferența dintre Error și Exception, crearea de excepții personalizate pentru logica de business, blocul finally și logging structurat.

Sintaxă
try { ... } catch (CustomException $e) { ... } catch (Throwable $t) { ... } finally { ... }

În PHP 7 și 8, întregul sistem de erori al limbajului a fost unificat sub interfața de bază Throwable. Erorile fatale ale motorului PHP (precum TypeError, ParseError sau DivisionByZeroError) nu mai opresc brusc scriptul în stil procedural, ci sunt aruncate ca instanțe ale clasei Error, putând fi interceptate elegant în blocuri try ... catch.

Ierarhia Throwable și definirea de excepții de business
<?php

declare(strict_types=1);

// 1. Definirea unei excepții personalizate pentru logica de business
class FonduriInsuficienteException extends Exception {
    public function __construct(
        public readonly float $soldCurent,
        public readonly float $sumaCeruta,
        string $message = "Fonduri insuficiente pentru efectuarea tranzacției."
    ) {
        parent::__construct($message);
    }
}

// 2. Clasă care aruncă excepții controlate
class Portofel {
    public function __construct(private float $balanta = 100.0) {}

    public function retragere(float $suma): void {
        if ($suma > $this->balanta) {
            throw new FonduriInsuficienteException($this->balanta, $suma);
        }
        $this->balanta -= $suma;
    }
}

// 3. Prinderea specifică și garantarea curățării resurselor cu finally
$portofel = new Portofel(50.0);

try {
    $portofel->retragere(150.0);
} catch (FonduriInsuficienteException $e) {
    // Tratare specifică eroare de business:
    echo "Tranzacție eșuată: Ai cerut {$e->sumaCeruta} RON, dar mai ai doar {$e->soldCurent} RON.\n";
} catch (Throwable $e) {
    // Plasa de siguranță supremă: prinde orice eroare neașteptată de sistem
    error_log("Eroare gravă de sistem: " . $e->getMessage());
    echo "A apărut o problemă tehnică temporară.\n";
} finally {
    // Se execută ÎNTOTDEAUNA, indiferent dacă a apărut o eroare sau nu:
    echo "Jurnalul de audit al tranzacției a fost închis.\n";
}

Arborele de Moștenire Throwable

  • Throwable (Interfața rădăcină)
    • Exception — Pentru excepții logice și de aplicație (create de programator sau biblioteci).
      • RuntimeException, InvalidArgumentException, etc.
    • Error — Pentru erori interne generate automat de motorul PHP.
      • TypeError — Parametru sau return type incompatibil.
      • ValueError — Tipul este corect, dar valoarea este invalidă.
      • UnhandledMatchError — Nicio ramură găsită în expresia match.