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;

  1. 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.
  2. 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.
  3. 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

Obsługa błędów PHP

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

Uchwyt wyjątku PHP w 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

. Obsługa błędów PHP


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.

Uchwyt wyjątku PHP w PHP

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.

Uchwyt wyjątku PHP w PHP

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

Wiele 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

Uchwyt wyjątku PHP w PHP

Wróć do pliku PHP i przekaż -1 jako parametr, jak pokazano na poniższym diagramie.

Uchwyt wyjątku PHP w PHP

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.