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