Obsługa błędów

Wyjątki

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 :


Fatal error: Uncaught exception 'Exception' with message 'blad' in /homez.106/czerner/www/pawel/test.php5:2 Stack trace: #0 {main} thrown in /homez.104/login/www/pawel/test.php5 on line 2

Wyłapywanie wyjątków

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 :

Stalo sie cos zlego!zmienna nie jest typu integer

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();
}