Przykład PHP Try Catch: samouczek dotyczący obsługi wyjątków i błędów
Co to jest wyjątek?
Błąd to nieoczekiwany wynik programu, którego sam program nie może obsłużyć.
Błędy są rozwiązywane poprzez naprawienie programu. Przykładem błędu może być nieskończona pętla, która nigdy nie przestaje się wykonywać.
Wyjątkiem jest nieoczekiwany wynik programu, który może zostać obsłużony przez sam program.
Przykłady wyjątków obejmują próbę otwarcia pliku, który nie istnieje.
Ten wyjątek można obsłużyć albo przez utworzenie pliku, albo przez umożliwienie użytkownikowi wyszukania pliku.
Po co obsługiwać wyjątek?
- Unikaj nieoczekiwanych wyników na naszych stronach, które mogą być bardzo irytujące lub irytujące dla naszych użytkowników końcowych
- Popraw bezpieczeństwo naszych aplikacji, nie ujawniając informacji, które złośliwi użytkownicy mogą wykorzystać do zaatakowania naszych aplikacji
- Wyjątki PHP służą do zmiany normalnego działania programu, jeśli wystąpi jakikolwiek przewidywalny błąd.
Obsługa błędów PHP
Gdy wystąpi błąd, w zależności od ustawień konfiguracyjnych, PHP wyświetla w przeglądarce internetowej komunikat o błędzie z informacją dotyczącą błędu, który wystąpił.
PHP oferuje wiele sposobów obsługi błędów.
Przyjrzymy się trzem (3) powszechnie stosowanym metodom;
- Umrzeć oświadczenia– funkcja die łączy funkcję echa i wyjścia w jednym. Jest to bardzo przydatne, gdy chcemy wypisać komunikat i zatrzymać wykonywanie skryptu w przypadku wystąpienia błędu.
- Niestandardowe procedury obsługi błędów – są to funkcje definiowane przez użytkownika, które są wywoływane w przypadku wystąpienia błędu.
- Raportowanie błędów PHP – komunikat o błędzie zależny od ustawień raportowania błędów PHP. Ta metoda jest bardzo przydatna w środowisku programistycznym, gdy nie masz pojęcia, co spowodowało błąd. Wyświetlane informacje mogą pomóc w debugowaniu aplikacji.
Przykłady obsługi błędów
Przyjrzyjmy się teraz kilku prostym przykładom z procedurami obsługi błędów.
Załóżmy, że stworzyliśmy aplikację, która wykorzystuje pliki tekstowe do przechowywania danych. Możemy chcieć sprawdzić, czy plik istnieje, zanim spróbujemy odczytać z niego dane.
Poniższy kod implementuje powyższy przykład.
<?php $denominator = 0; echo 2 / $denominator; ?>
Zakładając, że zapisałeś plik simple_error.php w folderze phptuts, otwórz adres URL http://localhost/phptuts/simple_error.php
Otrzymasz następujące wyniki
Jak widać z powyższych wyników, sprawia to, że nasza aplikacja wygląda nieprofesjonalnie i może być irytująca dla użytkownika.
Zmodyfikujemy powyższy kod i napiszemy procedurę obsługi błędów dla aplikacji
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
Zakładając, że zapisałeś powyższy kod jako error_handling.php, otwórz adres URL http://localhost/phptuts/error_handling.php
Uwaga: dobrą praktyką bezpieczeństwa jest wyświetlanie komunikatu takiego jak pokazany powyżej zamiast komunikatu „Nie znaleziono pliku”.
Przyjrzyjmy się innemu przykładowi, w którym zastosowano niestandardową procedurę obsługi błędów.
Niestandardowa procedura obsługi błędów zostanie ustawiona jako domyślna funkcja obsługi błędów PHP i zasadniczo wyświetli numer błędu i komunikat.
Poniższy kod ilustruje implementację powyższego przykładu
<?php function my_error_handler($error_no, $error_msg) { echo "Opps, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
Otwórz adres URL http://localhost/phptuts/custom_error_handler.php otrzymasz następujące wyniki
Jak widać z powyższego przykładu, niestandardowe procedury obsługi błędów są potężne w tym sensie, że
- Pozwalają nam dostosować komunikaty o błędach.
- Niestandardowy program do obsługi błędów może również obejmować rejestrowanie błędów w pliku/bazie danych, wysyłanie wiadomości e-mail do programisty itd.
Przyjrzyjmy się teraz trzeciemu typowi obsługi błędów. Będziemy używać wbudowanej w PHP funkcji error_reporting. Ma ona następującą podstawową składnię
<?php error_reporting($reporting_level); ?>
TUTAJ,
- „error_reporting” to funkcja raportowania błędów PHP
- „$reporting_level” jest opcjonalny i można go użyć do ustawienia poziomu raportowania. Jeśli nie określono żadnego poziomu raportowania, PHP użyje domyślnego poziomu raportowania błędów określonego w pliku php.ini.
Poziom raportowania | Opisy Konstrukcyjne | Przykład |
---|---|---|
E_OSTRZEŻENIE | Wyświetla tylko komunikaty ostrzegawcze. Nie wstrzymuje wykonywania skryptu | raportowanie_błędów(E_WARNING); |
E_UWAGA | Wyświetla powiadomienia, które mogą wystąpić podczas normalnego wykonywania programu lub mogą oznaczać błąd. | raportowanie_błędów(E_ UWAGA); |
E_USER_ERROR | Wyświetla błędy generowane przez użytkownika, tj. niestandardową procedurę obsługi błędów | raportowanie_błędów(E_USER_ERROR); |
E_USER_OSTRZEŻENIE | Wyświetla komunikaty ostrzegawcze generowane przez użytkownika | raportowanie_błędów(E_USER_WARNING); |
E_USER_NOTICE | Wyświetla powiadomienia generowane przez użytkownika | raportowanie_błędów(E_USER_NOTICE); |
E_RECOVERABLE_ERROR | Wyświetla błędy, które nie są krytyczne i można je obsłużyć za pomocą niestandardowych procedur obsługi błędów | raportowanie_błędów(E_RECOVERABLE_ERROR); |
E_ALL | Wyświetla wszystkie błędy i ostrzeżenia | raportowanie_błędów(E_ ALL); |
Różnica między błędami a wyjątkami
- Wyjątki są zgłaszane i mają zostać przechwycone, podczas gdy błędy są zazwyczaj nieodwracalne.
- Wyjątki są obsługiwane w sposób obiektowy. Oznacza to, że gdy zostanie zgłoszony wyjątek, tworzony jest obiekt wyjątku zawierający szczegóły wyjątku.
Poniższa tabela przedstawia metody obiektów wyjątków
Metoda wykonania | Opisy Konstrukcyjne | Przykład |
---|---|---|
getMessage () | Wyświetla komunikat wyjątku |
<?php echo $e->getMessage(); ?> |
Zdobądź szyfr() | Wyświetla kod numeryczny reprezentujący wyjątek |
<?php echo $e->getCode(); ?> |
dostać plik() | Wyświetla nazwę pliku i ścieżkę, w której wystąpił wyjątek |
<?php echo $e->getFile(); ?> |
pobierzLinię() | Wyświetla numer wiersza, w którym wystąpił wyjątek |
<?php echo $e->getLine(); ?> |
getTrace() | Wyświetla tablicę śledzenia wstecznego przed wyjątkiem |
<?php print_r( $e->getTrace()); ?> |
pobierz poprzedni() | Wyświetla poprzedni wyjątek przed bieżącym |
<?php echo $e->getPrevious(); ?> |
getTraceAsString() | Wyświetla ślad wyjątku jako ciąg znaków, a nie tablicę |
<?php echo $e->getTraceAsString(); ?> |
__toString() | Wyświetla cały wyjątek jako ciąg |
<?php echo $e->__toString(); ?> |
Poniżej przedstawiono podstawową składnię zgłaszania wyjątku.
<?php throw new Exception("This is an exception example"); ?>
TUTAJ,
- „throw” to słowo kluczowe używane do zgłaszania wyjątku
- „nowy wyjątek(…)” tworzy obiekt wyjątku i przekazuje ciąg znaków „To jest przykład wyjątku” jako parametr komunikatu.
Powyższy kod generuje następujący komunikat.
Przyjrzymy się teraz przykładowi implementującemu wyjątki typu „rzut” i „złapanie”.
Zmodyfikujemy powyższy przykład i uwzględnimy try, rzucanie i łapanie.
Ma następującą podstawową składnię.
<?php try { //code goes here that could potentially throw an exception } catch (Exception $e) { //exception handling code goes here } ?>
TUTAJ,
- „try{…}” to blok kodu do wykonania, który może potencjalnie zgłosić wyjątek
- „catch(Exception $e){…}” to blok kodu, który przechwytuje zgłoszony wyjątek i przypisuje obiekt wyjątku do zmiennej $e.
Poniższy kod przedstawia podstawowy przykład wyjątku z zaimplementowanym wyjątkiem try, rzut i catch.
Program celowo zgłasza wyjątek, który następnie przechwytuje.
<?php try { $var_msg = "This is an exception example"; throw new Exception($var_msg); } catch (Exception $e) { echo "Message: " . $e->getMessage(); echo ""; echo "getCode(): " . $e->getCode(); echo ""; echo "__toString(): " . $e->__toString(); } ?>
Otwórz adres URL http://localhost/phptuts/exception_handling.php Otrzymasz następujące wyniki.
Możliwe jest również utworzenie wielu wyjątków dla jednej instrukcji php try w zależności od typu zgłoszonego wyjątku.
Zobacz artykuł dot MySQL, Dostęp do danych PHP… przykłady implementacji wielu wyjątków
Wiele wyjątków
Wiele wyjątków używa wielu bloków try catch do obsługi zgłoszonych wyjątków. Wiele wyjątków jest przydatnych, gdy;
- Chcesz wyświetlić dostosowany komunikat w zależności od zgłoszonego wyjątku
- Chcesz wykonać unikalną operację w zależności od zgłoszonego wyjątku
Poniższy schemat blokowy ilustruje działanie wielu wyjątków
Przyjrzyjmy się przykładowi, w którym zastosowano wiele wyjątków.
Zmodyfikujemy kod dzielący liczbę przez przekazany mianownik.
Spodziewamy się wystąpienia dwóch rodzajów wyjątków;
- Dzielenie przez zero
- Dzielenie przez liczbę ujemną
Dla uproszczenia w naszych blokach catch będziemy wyświetlać tylko typ wyjątku.
Do zgłaszania wyjątków używana jest wbudowana w PHP klasa wyjątków.
Stworzymy dwie klasy, które rozszerzają klasę wyjątków i używają ich do zgłaszania wyjątków.
Poniższy kod przedstawia implementację.
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
Testowanie kodu
Zakładamy, że zapisałeś plik multiple_exceptions.php w folderze phptuts.
Przejdź do adresu URL http://localhost/phptuts/multiple_exceptions.php
Wróć do pliku PHP i przekaż -1 jako parametr, jak pokazano na poniższym diagramie.
Przejdź do adresu URL http://localhost/phptuts/multiple_exceptions.php.
Jakie wyniki otrzymujesz? Przekaż 3 jako parametr.
Jakie wyniki otrzymujesz?
Podsumowanie
- Błędy to nieoczekiwane wyniki generowane przez kod PHP
- Obsługa błędów poprawia wydajność aplikacji
- PHP ma wbudowane funkcje, które można wykorzystać do dostosowania sposobu, w jaki PHP zgłasza błędy
- Wyjątki są jak błędy, ale można je wychwycić za pomocą bloku catch po rzuceniu.
- Wyświetlanie komunikatów o błędach zawierających informacje o błędach jest uważane za złą praktykę bezpieczeństwa.