Î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.
Întrebări & Exemple de Cod:
Gestionarea Modernă a Erorilor și Excepțiilor în PHP 8: Throwable și ExcepțiiAi o nelămurire despre utilizarea comenzii
Gestionarea Modernă a Erorilor și Excepțiilor în PHP 8: Throwable și Excepțiisau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.