Wyjątki powodują określone zachowanie PHP podczas napotkania błędu w bloku kodu.
Wyjątki są to obiekty klasy Exception bądź klas pochodnych od niej.
Wyjątek wywołujemy pomocą operatora throw
Konstruktor klasy Exception pobiera dwa opcjonalne argumenty:
Wszystkie metody klasy Excepion posiadają modyfikator final, więc nie możemy ich modyfikować w klasach pochodnych. Oto ich lista:
Nieobsłużony wyjątek powoduje przerwanie skryptu i zwraca ślad stosu
<?php
throw new Exception('blad',12);
?>
Oto co ujrzymy w rezultacie :
Wyjątki wyłapujemy za pomocą bloku try - catch
Dzięki wyłapywaniu wyjątków jesteśmy w stanie określić jak ma się zachować kod w razie napotkania wyjątku
Składnia bloku :
try{
// tutaj wywolujemy wyjatki ktore beda przechwycone
}
catch(klasaWyjatku1 $nazwaWblokuCatch){
// tresc funkcji
}
catch(klasaWyjatku2 $nazwaWblokuCatch){
// tresc funkcji
}
...
catch(klasaWyjatku3 $nazwaWblokuCatch){
// tresc funkcji
}
Przykład :
<?php
class FunnyException extends Exception{}
class IntException extends FunnyException{}
try{
$zmienna = 'jasio';
if( !is_int($zmienna) ){
throw new IntException(
'zmienna nie jest typu integer');
}
echo 'to sie nie wykona gdy wystapi wyjatek,
interpreter od razu przejdzie do blokow catch';
}
catch(FunnyException $wyjatek){
echo 'Stalo sie cos zlego!'.$wyjatek->getMessage();
}
catch(Exception $wyjatek){
echo 'Standardowy wyjatek'.$wyjatek->getMessage();
}
catch(IntException $wyjatek){
echo 'Nastapil blad typu zmiennej
'.$wyjatek->getMessage();
}
?>
Powyższy kod jest poprawny, nie jest jednak poprawny logicznie
Na ekranie ujrzymy :
Stało się tak ponieważ PHP przeszukuje bloki catch zaczynając od tego z najmniejszym numerem wiesza.Poprawność sprawdzana jest podobnie jak przy podawaniu typu obieku przy funkcjach - operatorem istanceof. Klasa IntException dziedziczy po FunnyException tak więc wykonywany jest pierwszy blok catch.
Zapamiętaj klasy w bloku catch należy podawawać począwszy od tych położonych najniżej w hierarhii dziedziczenia
Oto poprawy logicznie kod :
<?php
class FunnyException extends Exception{}
class IntException extends FunnyException{}
try{
$zmienna = 'jasio';
if( !is_int($zmienna) ){
throw new IntException(
'zmienna nie jest typu integer');
}
echo 'to sie nie wykona gdy wystapi wyjatek,
interpreter od razu przejdzie do blokow try';
}
catch(IntException $wyjatek){
echo 'nastapil blad typu zmiennej
'.$wyjatek->getMessage();
}
catch(FunnyException $wyjatek){
echo 'Stalo sie cos zlego!
'.$wyjatek->getMessage();
}
catch(Exception $wyjatek){
echo 'Standardowy wyjatek
'.$wyjatek->getMessage();
}
Darmowy hosting zapewnia PRV.PL