Generarea excepțiilor
PHP implicit prezintă situații în care sunt generate automat erori și excepții, de exemplu, la împărțirea la zero. Dar uneori este necesar să generăm manual o excepție. De exemplu:
class Person
{
private $name, $age;
function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
function printInfo()
{
echo "Name: $this->name<br>Age: $this->age";
}
}
$tom = new Person("Tom", -105);
$tom->printInfo();
Aici clasa Person primește prin constructor numele și vârsta utilizatorului. Cu toate acestea, în realitate, putem transmite orice valori, de exemplu, o vârstă negativă.
Este evident că aceasta este o valoare invalidă. Pentru a evita astfel de situații, una dintre soluții este generarea unei excepții atunci când se primește o valoare invalidă.
Pentru generarea unei excepții se folosește operatorul throw, urmat de obiectul excepției.
De exemplu, să modificăm codul clasei Person definit mai sus:
class Person
{
private $name, $age;
function __construct($name, $age)
{
if($age < 0)
{
throw new Exception("Vârstă invalidă");
}
$this->name = $name;
$this->age = $age;
}
function printInfo()
{
echo "Name: $this->name<br>Age: $this->age";
}
}
$tom = new Person("Tom", -105);
$tom->printInfo();
Acum, dacă vârsta este negativă, se va genera o excepție de tip Exception.
throw new Exception("Vârstă invalidă");
Constructorul clasei Exception primește ca parametru un mesaj de eroare, care va fi afișat la apariția excepției.
În final, la execuția liniei:
$tom = new Person("Tom", -105);
se va executa codul:
throw new Exception("Vârstă invalidă");
Și în final, în browser vom vedea informația despre eroare:
Fatal error: Uncaught Exception: Vârstă invalidă in C:\localhost\hello.php:17 Stack trace: #0 C:\localhost\hello.php(26): Person->__construct('Tom', -105) #1 {main} thrown in C:\localhost\hello.php on line 17
Deoarece apelul constructorului clasei Person creează o situație în care poate apărea o excepție, este mai bine să plasăm apelul constructorului într-o construcție try-catch:
class Person
{
private $name, $age;
function __construct($name, $age)
{
$this->name = $name;
if($age < 0)
{
throw new Exception("Vârstă invalidă");
}
$this->age = $age;
}
function printInfo()
{
echo "Name: $this->name<br>Age: $this->age";
}
}
try
{
$tom = new Person("Tom", -105);
$tom->printInfo();
}
catch(Exception $ex)
{
echo $ex->getMessage();
}
Afișarea în browser:
Vârstă invalidă
Crearea claselor de excepții
La generarea excepțiilor putem să ne bazăm pe clasele de excepții încorporate, cum este cazul clasei Exception din exemplul de mai sus. Totuși, poate fi necesar să transmitem mai multe informații la generarea excepției sau să personalizăm comportamentul clasei de excepții.
În acest caz, putem crea propria clasă de excepții, adaptată nevoilor specifice:
class PersonInvalidAgeException extends Exception
{
function __construct($age)
{
$this->message = "Vârstă invalidă: $age. Vârsta trebuie să fie între 0 și 120";
}
}
class Person
{
private $name, $age;
function __construct($name, $age)
{
$this->name = $name;
if($age < 0)
{
throw new PersonInvalidAgeException($age);
}
$this->age = $age;
}
function printInfo()
{
echo "Name: $this->name<br>Age: $this->age";
}
}
try
{
$tom = new Person("Tom", -105);
$tom->printInfo();
}
catch(PersonInvalidAgeException $ex)
{
echo $ex->getMessage();
}
În exemplu este definită o clasă simplă de excepție, care este moșteneștă din clasa Exception. (În realitate, pentru a crea o clasă de excepție, este suficient să implementăm interfața Throwable).
În această clasă, constructorul este suprascris și primește ca parametru vârsta invalidă.
Valoarea afișată în clasa Exception este stocată în proprietatea message, astfel încât în clasa derivată PersonInvalidAgeException putem folosi această proprietate pentru a seta propriul mesaj. În final, la generarea excepției, browserul va afișa mesajul corespunzător de eroare:
Vârstă invalidă: -105. Vârsta trebuie să fie între 0 și 120