Obsługa wyjątków.

Obsługa wyjątków, to po prostu pewien sposób (bardziej „elegancki”) obsługi błędów.

Podstawowa składnia obsługi wyjątków.

Na początek próbujemy (ang. try) wykonać fragment kodu znajdujący się w sekcji try.

try {

// kod, który może powodować jakąś sytuację wyjątkową

} catch (KlasaWyjątku $zmienna) {

// kod obsługi wyjątku

}

Następnie przechwytujemy wyjątek (ang. catch) i wykonujemy kod znajdujący się w sekcji catch. Kod obsługi wyjątku to najczęściej wyświetlenie komunikatu błędu.

KlasaWyjątku to najczęściej wbudowana klasa Exception (chyba, że stworzyłeś własną klasę do obsługi wyjątku, co opiszemy w dalszej części artukułu).

$zmienna – zdefiniowana przez nas zmienna do przechowywania obiektu klasy Exception. Najczęściej ta zmienna przyjmuje nazwę $e, gdzie „e” oznacza skrót słowa exception.

W bloku catch możemy wykorzystać metody obiektu klasy Exception, które dostarczają dokładne informacje o błędzie.

Wykaz dostępnych metod klasy Exception:

Metoda Opis
getCode() Metoda zwracająca jedynie kod błędu.
getFile() Metoda zwracająca nazwę pliku, w którym wystąpił wyjątek.
getLine() Zwracany jest numer linii  w którym wystąpił błąd.
getMessage() Zwracany jest komunikat o błędzie.
getTrace() Zwracana jest tablica zawierającą informacje debugowe (tzw. backtrace).
getTraceAsString() Zwraca backtrace jako ciąg znaków.

 

Silnik PHP udostępnia możliwość zgłoszenia, czy też jak się zwykło mówić „rzucenia” wyjątku (ang. throw). Polega to na wygenerowaniu wyjątku w wyjątkowej (nadzwyczajnej) sytuacji, która wymaga specjalnej obsługi.

Przykłady:

 

        function podziel($a, $b){

            if($b == 0)

                throw new exception(’Nie dzielimy przez zero !’);

            return $a/$b;

        }

            

        try{

   echo podziel(2,0);

} catch(exception $e){

echo $e->getMessage();

        }

 

        function obliczPole($a, $b){

            if($a <= 0 || $b <= 0)

            throw new exception(’Obliczanie pola przy wartości a lub b zero nie ma większego sensu !’);

return $a * $b;

        }

 

        if(function_exists(’obliczPole’)){

            try{

          echo obliczPole(1,0);

            } catch(exception $e)

                echo $e->getMessage();

            }

        }

 

Tworzenie własnej klasy obsługi wyjątku.

Stworzenie własnej obsługi błędu polega na utworzeniu nowej klasy dziedziczącej po klasie Exception.

Przykład podstawowy:

class mniejszeOdZera extends Exception{

}

 

function czyDodatniArg($a){

if($a < 0){

throw new mniejszeOdZera(„Argument mniejszy od zera: $a.”);

}

}

 

try{

czyDodatniArg(-10);

} catch(mniejszeOdZera $e){

echo $e->getMessage();

      }

 

Przykład1 z przeciążeniem konstruktora:

class mniejszeOdZera extends Exception{

public function __construct($message = null, $code = 0){

if (!$message)

throw new $this(’Brak komunikatu błedu, wywoływana klasa: ’. get_class($this));

}

parent::__construct($message, $code);

}

}

 

function czyDodatniArg($a){

if($a < 0){

throw new mniejszeOdZera();

}

}

 

try{

czyDodatniArg(-10);

} catch(mniejszeOdZera $e){

echo $e->getMessage();

}

Wynik:

Brak komunikatu błedu, wywoływana klasa: mniejszeOdZera

 

Przykład2 z przeciążeniem konstruktora (z własnym komunikatem oraz kodem błędu):

class mniejszeOdZera extends Exception{

public function __construct($message = null, $code = 0){

if (!$message) {

throw new $this(’Brak komunikatu błedu, wywoływana klasa: ’. get_class($this));

}

parent::__construct($message, $code);

}

}

 

function czyDodatniArg($a){

if($a < 0){

throw new mniejszeOdZera(’Własny komunikat błędu’, 900);

}

}

 

try{

czyDodatniArg(-10);

} catch(mniejszeOdZera $e){

echo $e->getMessage();

        echo $e->getCode();

}

Wynik:

Własny komunikat błędu900

Przewijanie do góry