30 dniowy kurs php – dzień 20 – wyjątki


Back-end (php, mysql)

W obsłudze błędów spotkałeś się już z podobną metodą. W konstrukcji warunkowej if wymusiliśmy powstanie błędu funkcją trigger_error(). Tym razem użyjemy funkcji wyjątku, a całą konstrukcja będzie wyglądała tak:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title>Wyjątki</title>
</head>
<body>

<?php
// tworzymy funkcję z wyjątkiem
function sprawdzNr($nr)
{
 if($nr > 1)
 {
 throw new Exception('Wartość większa od 1');
 }
return true;
}

// uruchom funkcję z wyjątkiem
sprawdzNr(2);
?>

</body>
</html>

W efekcie pojawi się dość długi fatalny błąd:

Fatal error: Uncaught exception 'Exception' with message 'Wartość większa od 1' in C:\wamp\www\KursPHP\dzien20\index.php:15 Stack trace: #0 C:\wamp\www\KursPHP\dzien20\index.php(21): sprawdzNr(2) #1 {main} thrown in C:\wamp\www\KursPHP\dzien20\index.php on line 15

Pytanie czemu używać funkcji throw new Exception() zamiast poznanej w poprzedniej lekcji obsługa błędów trigger_error()? Wyjątki można przechwycić i zdecydować co ma się dziać w przypadku ich wystąpienia. Dodatkowo przechwytywanie błędu może odbywać się w kompletnie innej części skryptu, niż wystąpienie wyjątku. Przez co dalsze wykonywanie skryptu może zacząć się w całkiem innym miejscu.

Try i catch

Poznałeś już funkcję throw, która „wyrzuca” wyjątek, teraz pora na try i catch. Czyli funkcje „próbowania” czy wyjątek wystąpił i przechwytywania jeśli tak.

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title>Wyjątki</title>
</head>
<body>

<?php
// tworzymy funkcję z wyjątkiem
function sprawdzNr($nr)
{
 if($nr > 1)
 {
 throw new Exception('Wartość większa od 1');
 }
return true;
}

// uruchomienie sprawdzania wyjątku w innym bloku skryptu
try
 {
 sprawdzNr(2);
 // jeśli wyjątek zostanie wyrzucony, nie zobaczysz tego tekstu
 echo 'Jeśli to widzisz nr równa się 1 lub mniej.';
 }

// wyłap wyjątek
catch(Exception $e)
 {
 echo 'Wiadomość: ' . $e->getMessage();
 }
?>

</body>
</html>

Spróbuj zmienić wartość w wywoływanej funkcji sprawdzNr() na 1 albo -16. Zobaczysz różnicę w wyświetlonym tekście. Zamiast tekstu, możesz rzecz jasna wywołać dowolny kod.

W catch() musimy podać wartość jaką chcemy wyłapać, w tym wypadku jest to wyjątek czyli klasa Exception. Dodatkowo utworzyliśmy zmienną $e, w której zapisuje się treść wystąpienia wyjątku podana w throw new Exception(). Aby wyświetlić wiadomość ze zmiennej $e musimy jeszcze użyć funkcji getMessage, która jak podaje dokumentacja php zwraca wartość wyjątku.

Zauważ też, że wywoływanie funkcji sprawdzNr() pojawia się wewnątrz klamer konstrukcji try. To właśnie w try musi wystąpić wyjątek aby można było go złapać w catch(). Używając konstrukcji try musimy też obligatoryjnie użyć catch(). Bez tego zobaczymy błąd parsowania informujący o braku oczekiwanego wyjątku ‚T_CATCH’. Try i catch są więc niczym papużki nierozłączki.