PHP - Obsługa błędów i wyjątków

Obsługa błędów to proces wychwytywania błędów zgłaszanych przez program, a następnie podejmowania odpowiednich działań. Jeśli poprawnie poradzisz sobie z błędami, może to prowadzić do wielu nieprzewidzianych konsekwencji.

Obsługa błędów w PHP jest bardzo prosta.

Korzystanie z funkcji die ()

Pisząc swój program PHP, przed kontynuowaniem należy sprawdzić wszystkie możliwe błędy i podjąć odpowiednie działania, gdy jest to wymagane.

Spróbuj wykonać poniższy przykład bez posiadania /tmp/test.xt plik iz tym plikiem.

<?php
   if(!file_exists("/tmp/test.txt")) {
      die("File not found");
   }else {
      $file = fopen("/tmp/test.txt","r");
      print "Opend file sucessfully";
   }
   // Test of the code here.
?>

W ten sposób możesz napisać wydajny kod. Korzystając z powyższej techniki, możesz zatrzymać program, gdy tylko wystąpi błąd i wyświetlić bardziej znaczący i przyjazny dla użytkownika komunikat.

Definiowanie niestandardowej funkcji obsługi błędów

Możesz napisać własną funkcję do obsługi każdego błędu. PHP zapewnia strukturę do definiowania funkcji obsługi błędów.

Ta funkcja musi obsługiwać co najmniej dwa parametry (poziom błędu i komunikat o błędzie), ale może akceptować do pięciu parametrów (opcjonalnie: plik, numer wiersza i kontekst błędu) -

Składnia

error_function(error_level,error_message, error_file,error_line,error_context);

Sr.No Parametr i opis
1

error_level

Wymagane - określa poziom raportu o błędach dla błędu zdefiniowanego przez użytkownika. Musi być liczbą wartości.

2

error_message

Wymagane - określa komunikat o błędzie dla błędu zdefiniowanego przez użytkownika

3

error_file

Opcjonalne - określa nazwę pliku, w którym wystąpił błąd

4

error_line

Opcjonalne - określa numer wiersza, w którym wystąpił błąd

5

error_context

Opcjonalne - określa tablicę zawierającą wszystkie zmienne i ich wartości używane w momencie wystąpienia błędu

Możliwe poziomy błędów

Te poziomy raportów o błędach to różne typy błędów, do których można użyć procedury obsługi błędów zdefiniowanej przez użytkownika. Te wartości cab są używane w połączeniu z użyciem| operator

Sr.No Stała i opis Wartość
1

.E_ERROR

Błędy krytyczne w czasie wykonywania. Wykonywanie skryptu zostaje zatrzymane

1
2

E_WARNING

Niekrytyczne błędy czasu wykonywania. Wykonywanie skryptu nie zostaje wstrzymane

2
3

E_PARSE

Błędy analizy w czasie kompilacji. Błędy analizy powinny być generowane tylko przez parser.

4
4

E_NOTICE

Uwagi dotyczące czasu pracy. Skrypt znalazł coś, co może być błędem, ale może się również zdarzyć podczas normalnego uruchamiania skryptu

8
5

E_CORE_ERROR

Błędy krytyczne występujące podczas pierwszego uruchomienia PHP.

16
6

E_CORE_WARNING

Niekrytyczne błędy czasu wykonywania. Dzieje się tak podczas pierwszego uruchomienia PHP.

32
7

E_USER_ERROR

Błąd krytyczny wygenerowany przez użytkownika. To jest jak E_ERROR ustawione przez programistę za pomocą funkcji PHP trigger_error ()

256
8

E_USER_WARNING

Niekrytyczne ostrzeżenie wygenerowane przez użytkownika. To jest jak E_WARNING ustawione przez programistę za pomocą funkcji PHP trigger_error ()

512
9

E_USER_NOTICE

Powiadomienie wygenerowane przez użytkownika. To jest jak E_NOTICE ustawione przez programistę za pomocą funkcji PHP trigger_error ()

1024
10

E_STRICT

Uwagi dotyczące czasu pracy. Włącz, aby PHP sugerowało zmiany w kodzie, które zapewnią najlepszą interoperacyjność i kompatybilność w przód.

2048
11

E_RECOVERABLE_ERROR

Wykrywalny błąd krytyczny. Jest to podobne do E_ERROR, ale może zostać przechwycone przez uchwyt zdefiniowany przez użytkownika (zobacz także set_error_handler ())

4096
12

E_ALL

Wszystkie błędy i ostrzeżenia, z wyjątkiem poziomu E_STRICT (E_STRICT będzie częścią E_ALL od PHP 6.0)

8191

Wszystkie powyższe poziomy błędów można ustawić za pomocą wbudowanej funkcji bibliotecznej PHP, gdzie poziom cab jest dowolną wartością zdefiniowaną w powyższej tabeli.

int error_reporting ( [int $level] )

Poniżej przedstawiono sposób tworzenia jednej funkcji obsługi błędów -

<?php
   function handleError($errno, $errstr,$error_file,$error_line) {
      echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line";
      echo "<br />";
      echo "Terminating PHP Script";
      
      die();
   }
?>

Po zdefiniowaniu własnego modułu obsługi błędów należy go ustawić za pomocą wbudowanej biblioteki PHP set_error_handlerfunkcjonować. Przyjrzyjmy się teraz naszemu przykładowi, wywołując funkcję, która nie istnieje.

<?php
   error_reporting( E_ERROR );
   
   function handleError($errno, $errstr,$error_file,$error_line) {
      echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line";
      echo "<br />";
      echo "Terminating PHP Script";
      
      die();
   }
   
   //set error handler
   set_error_handler("handleError");
   
   //trigger error
   myFunction();
?>

Obsługa wyjątków

PHP 5 ma model wyjątków podobny do modelu innych języków programowania. Wyjątki są ważne i zapewniają lepszą kontrolę nad obsługą błędów.

Wyjaśnijmy tam nowe słowo kluczowe związane z wyjątkami.

  • Try- Funkcja używająca wyjątku powinna znajdować się w bloku „try”. Jeśli wyjątek nie zostanie wyzwolony, kod będzie kontynuowany normalnie. Jednak jeśli wyjątek zostanie wyzwolony, wyjątek zostanie „zgłoszony”.

  • Throw- W ten sposób wywołujesz wyjątek. Każdy „rzut” musi mieć co najmniej jeden „zaczep”.

  • Catch - Blok „catch” pobiera wyjątek i tworzy obiekt zawierający informacje o wyjątku.

Gdy zostanie zgłoszony wyjątek, kod następujący po instrukcji nie zostanie wykonany, a PHP spróbuje znaleźć pierwszy pasujący blok catch. Jeśli wyjątek nie zostanie przechwycony, zostanie wystawiony błąd krytyczny PHP z komunikatem „Niezłapany wyjątek ...

  • Wyjątek może zostać zgłoszony i przechwycony ("złapany") w PHP. Kod może być otoczony blokiem prób.

  • Każda próba musi mieć co najmniej jeden odpowiedni blok catch. Do przechwytywania różnych klas wyjątków można użyć wielu bloków catch.

  • Wyjątki mogą być rzucane (lub ponownie rzucane) w obrębie bloku catch.

Przykład

Poniżej znajduje się fragment kodu, skopiuj i wklej ten kod do pliku i sprawdź wynik.

<?php
   try {
      $error = 'Always throw this error';
      throw new Exception($error);
      
      // Code following an exception is not executed.
      echo 'Never executed';
   }catch (Exception $e) {
      echo 'Caught exception: ',  $e->getMessage(), "\n";
   }
   
   // Continue execution
   echo 'Hello World';
?>

W powyższym przykładzie funkcja $ e-> getMessage służy do uzyskania komunikatu o błędzie. Istnieją następujące funkcje, z których można korzystaćException klasa.

  • getMessage() - wiadomość o wyjątku

  • getCode() - kod wyjątku

  • getFile() - nazwa pliku źródłowego

  • getLine() - linia źródłowa

  • getTrace() - n tablica backtrace ()

  • getTraceAsString() - sformatowany ciąg śledzenia

Tworzenie niestandardowego programu obsługi wyjątków

Możesz zdefiniować własną niestandardową obsługę wyjątków. Użyj następującej funkcji, aby ustawić funkcję obsługi wyjątków zdefiniowaną przez użytkownika.

string set_exception_handler ( callback $exception_handler )

Tutaj exception_handlerto nazwa funkcji, która ma zostać wywołana, gdy wystąpi nieprzechwycony wyjątek. Tę funkcję należy zdefiniować przed wywołaniem set_exception_handler ().

Przykład

<?php
   function exception_handler($exception) {
      echo "Uncaught exception: " , $exception->getMessage(), "\n";
   }
	
   set_exception_handler('exception_handler');
   throw new Exception('Uncaught Exception');
   
   echo "Not Executed\n";
?>

Sprawdź pełny zestaw funkcji obsługi błędów w PHP Error Handling Functions