Î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 expresiamatch.