Zatem jak działają wyjątki? W ciele try{} dajemy kod w którym spodziewamy się wystąpienia wyjątku, nie należy zawierać za dużych fragmentów kodu. Zawieramy tylko tyle kodu, ile jest niezbędne do działania jakiegoś fragmentu aplikacji. Zależy nam na tym, że jeżeli zostanie zwrócony wyjątek, to dzięki catch(){} będziemy w stanie obsłużyć wyjątek tak, aby dalsza część aplikacji działała już poprawnie.

Tak jak już wspomniałem po bloku try{} umieszczamy blok/i catch(){} w którym wypisujemy jakiego wyjątku oczekujemy, a następnie w ciele bloku piszemy kod odpowiedzialny za “zreperowanie”. Bloków catch(){} umieszczamy tyle, ile wyjątków możemy się spodziewać i podołamy ich obsłudze.

Zademonstruje przykładowy szkic:

Try {
// Blok w którym spodziewamy sie wyjątku
}
catch (exception $ePierwszy ) {
// obsługa pieszego spodziewanego wyjątku
}
catch (exception $eNty ) {
// obsługa kolejnego wyjątku
}

Na początku uruchomiony jest blok try{}, jeżeli podczas jego działania zostanie zwrócony jakikolwiek wyjątek to następuje uruchomcie kolejnych bloków catch(){}, tj. Jeżeli wyjątek nie pasuje do pierwszego bloku sprawdzany jest kolejny (całość przypomina w pewnym sensie działanie switch()’a). Wyjątki dopasowywane są do bloków catch(){} po typie obiektu(nazwach klasy Exception). W wypadku braku wystąpienia wyjątku w bloku try{}, bloki catch(){} w ogóle nie zostają uruchomione.

Już mniej więcej wiemy jak obsłużyć wyjątki, teraz nauczymy się jak je zwracać. Do zwrócenia wyjątku używamy throw. Działa ona podobnie do return, z tą różnica że nie zwraca danych tylko wyrzuca wyjątek który łapiemy blokiem try{} i obsługujemy w pasującym ciele catch(){}.

Przykład:

<?php
$sPath = './router.php';
try {
if( !file_exists( $sPath ) ) {
throw new Exception( 'plik nie istnieje!' );
}
include $sPath;
if( !class_exists( 'Router' ) ) {
throw new Exception( 'Klasa Router nie istnieje!' );
}
$Router = new Router();
}
catch( Exception $Ex ) {
echo '<p>Wystąpiły problemy!</p>'."\n";
echo '<p>',$Ex,'</p>';
}
?>

W bloku try{} został umieszczony kod odpowiedzialny za sprawdzenie czy istnieje plik i klasa niezbędna do poprawnego działania naszego skryptu. W przypadku kiedy plik lub klasa nie istnieją zostaje zgłoszony wyjątek – skrypt po wyrzuceniu wyjątku nie wykonuje się dalej, tzn po uruchomionej konstrukcji throw od razu następuje przeskok do bloku catch(){}.

Ponieważ posiadamy jedna instrukcje catch(){} a typ klasy wyjątku [throw new Exception()] zgadza się właśnie z zdeklarowanym w tym bloku [catch( Exception $Ex )] zostaje uruchomione ciało właśnie tego bloku catch(){}.

W bloku catch(){} powinny zostać wykonane operacje odpowiedzialne za “odratowanie kodu” my jednak wyświetlimy tylko że pojawiły się problemy, obsłużeniem ich zajmiemy się trochę potem.

Kod pokazuje proste zastosowanie wyjątków, ale nic specjalnego on sobą nie reprezentuje. Żeby można było zacząć korzystać z pełnych dobrodziejstw wyjątków musimy przyjrzeć sie dokładniej ich budowie.