Najnowsze tutoriale tworzenie stron internetowych
 

PHP Obsługa błędów


Domyślna obsługa błędów w PHP jest bardzo prosta. Komunikat o błędzie z pliku, numer linii i komunikat opisujący błąd jest wysyłany do przeglądarki.


Obsługa błędów w PHP

Podczas tworzenia skryptów i aplikacji internetowych, obsługa błędów jest ważnym elementem. Jeśli kod błędu brakuje kodu sprawdzającego, program może wyglądać bardzo nieprofesjonalne i może być otwarty do zagrożeń bezpieczeństwa.

Ten poradnik zawiera jedne z najbardziej powszechnych metod sprawdzania błędów w PHP.

Pokażemy różne metody obsługi błędów:

  • Proste " die() " Sprawozdania
  • Błędy niestandardowe i wyzwalacze błędach
  • Zgłaszanie błędów

Podstawowe Obsługa błędów: Korzystanie z die() funkcja

Pierwszy przykład pokazuje prosty skrypt, który otwiera plik tekstowy:

<?php
$file=fopen("welcome.txt","r");
?>

Jeśli plik nie istnieje, może pojawi się błąd jak poniżej:

Warning : fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:\webfolder\test.php on line 2

Aby uniemożliwić użytkownikowi Otrzymuję komunikat o błędzie, jak ten powyżej, możemy sprawdzić, czy plik istnieje, zanim spróbujemy uzyskać do niego dostęp:

<?php
if(!file_exists("welcome.txt")) {
  die("File not found");
} else {
  $file=fopen("welcome.txt","r");
}
?>

Teraz, jeśli plik nie istnieje, pojawi się błąd jak poniżej:

File not found

Powyższy kod jest bardziej wydajny niż wcześniej kodu, ponieważ wykorzystuje prosty mechanizm obsługi błędów, aby zatrzymać skrypt po błędzie.

Jednakże, po prostu zatrzymać skrypt nie zawsze jest właściwa droga. Rzućmy okiem na alternatywnych funkcji PHP do obsługi błędów.


Tworzenie Error Handler niestandardowy

Tworzenie niestandardowej procedury obsługi błędów jest dość prosta. Po prostu utworzyć specjalną funkcję, która może zostać wywołana, gdy wystąpi błąd w PHP.

Funkcja ta musi być w stanie obsłużyć co najmniej dwóch parametrów (poziom błędu i komunikat o błędzie), ale można przyjąć maksymalnie pięciu parametrów (optionally: file, line-number, and the error context) :

Składnia

error_function(error_level,error_message,
error_file,error_line,error_context)
Parametr Opis
error_level Wymagany. Określa poziom o wadzie błędu zdefiniowanym przez użytkownika. Musi być liczbą wartość. Patrz tabela poniżej możliwych poziomach o wadzie
error_message Wymagany. Określa komunikat błędu zdefiniowanej przez użytkownika
error_file Opcjonalny. Określa nazwę pliku, w którym wystąpił błąd
error_line Opcjonalny. Określa numer wiersza, w którym wystąpił błąd
error_context Opcjonalny. Określa tablicę zawierającą wszystkich zmiennych i ich wartości, w trakcie używania, kiedy wystąpił błąd

Błąd Raport poziomy

Te poziomy o wadzie są różne rodzaje błędów handler błąd zdefiniowany przez użytkownika mogą być wykorzystywane do:

Wartość Stały Opis
2 E_WARNING Niezakończonych zgonem błędy run-time. Wykonanie skryptu nie jest zatrzymany
8 E_NOTICE Anonse Run-Time. Skrypt znaleźć coś, co może być błąd, ale może się zdarzyć, gdy uruchomiony skrypt normalnie
256 E_USER_ERROR Błąd krytyczny generowane przez użytkowników. Jest jak E_ERROR wyznaczonym przez programator z wykorzystaniem funkcji PHP trigger_error()
512 E_USER_WARNING Niezakończony zgonem ostrzeżenie generowane przez użytkowników. Jest jak E_WARNING wyznaczonym przez programator z wykorzystaniem funkcji PHP trigger_error()
1024 E_USER_NOTICE Generowane przez użytkowników wypowiedzenia. Jest jak E_NOTICE wyznaczonym przez programator z wykorzystaniem funkcji PHP trigger_error()
4096 E_RECOVERABLE_ERROR Połów błąd krytyczny. Jest jak E_ERROR ale mogą zostać pochwycone przez uchwyt zdefiniowane przez użytkownika (see also set_error_handler() )
8191 E_ALL Wszystkie błędy i ostrzeżenia (E_STRICT became a part of E_ALL in PHP 5.4)

Teraz pozwala utworzyć funkcję obsługi błędów:

function customError($errno, $errstr) {
  echo "<b>Error:</b> [$errno] $errstr<br>";
  echo "Ending Script";
  die();
}

Powyższy kod jest prostą funkcją obsługi błędów. Gdy jest uruchomiony, to dostaje poziom błędu oraz komunikat o błędzie. Następnie wyprowadza poziom błędu oraz komunikat i kończy skrypt.

Teraz, stworzyliśmy funkcję obsługi błędów musimy zdecydować, kiedy powinien on zostać uruchomiony.


Set Error Handler

Domyślną obsługi błędów PHP jest wbudowany obsługi błędów. Mamy zamiar zrobić funkcję powyżej domyślnej obsługi błędów w czasie trwania skryptu.

Jest możliwe, aby zmienić obsługi błędów do stosowania tylko dla niektórych błędów, w ten sposób skrypt może obsługiwać różne błędy w różny sposób. Jednak w tym przykładzie mamy zamiar wykorzystać naszą klasę obsługi błędów dla wszystkich błędów:

set_error_handler("customError");

Ponieważ chcemy, aby nasza funkcja zwyczaj obsłużyć wszystkie błędy, set_error_handler() potrzebne tylko jeden parametr, drugi parametr można dodać, aby określić poziom błędu.

Przykład

Testowanie obsługi błędów przez próby wyjściowej zmiennej, która nie istnieje:

<?php
//error handler function
function customError($errno, $errstr) {
  echo "<b>Error:</b> [$errno] $errstr";
}

//set error handler
set_error_handler("customError");

//trigger error
echo($test);
?>

Wyjście z powyższym kodzie powinno być coś takiego:

Error: [8] Undefined variable: test

Wywołać błąd

W skrypcie, gdzie użytkownicy mogą dane wejściowe warto wywołać błędy, gdy wystąpi nielegalne wejście. W PHP można to zrobić przez trigger_error() funkcji.

Przykład

W tym przykładzie występuje błąd, jeśli "test" zmienna jest większa niż "1" :

<?php
$test=2;
if ($test>=1) {
  trigger_error("Value must be 1 or below");
}
?>

Wyjście z powyższym kodzie powinno być coś takiego:

Notice : Value must be 1 or below
in C:\webfolder\test.php on line 6

Błąd może być wywołane gdziekolwiek chcesz w skrypcie, a poprzez dodanie drugiego parametru można określić, jaki poziom błędu jest wyzwalany.

Możliwe typy błędów:

  • E_USER_ERROR - krytyczny błąd czasu generowane przez użytkowników. Błędów, które nie mogą być odzyskane. Wykonanie skryptu zostaje zatrzymany
  • E_USER_WARNING - Non-fatal ostrzegawczy run-time generowane przez użytkowników. Wykonanie skryptu nie jest zatrzymany
  • E_USER_NOTICE - domyślna. Wskazówka run-time generowane przez użytkowników. Skrypt znaleźć coś, co może być błąd, ale może się zdarzyć, gdy uruchomiony skrypt normalnie

Przykład

W tym przykładzie E_USER_WARNING występuje wtedy, gdy "test" zmienna jest większa niż "1" . Jeśli wystąpi E_USER_WARNING użyjemy naszą klasę obsługi błędów i zakończyć skrypt:

<?php
//error handler function
function customError($errno, $errstr) {
  echo "<b>Error:</b> [$errno] $errstr<br>";
  echo "Ending Script";
  die();
}

//set error handler
set_error_handler("customError",E_USER_WARNING);

//trigger error
$test=2;
if ($test>=1) {
  trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>

Wyjście z powyższym kodzie powinno być coś takiego:

Error: [512] Value must be 1 or below
Ending Script

Teraz, kiedy nauczyliśmy się tworzyć nasze własne błędy i jak je wywołać, pozwala spojrzeć na rejestrowanie błędów.


Rejestrowanie błędów

Domyślnie PHP wysyła dziennik błędów do systemu rejestrowania serwera lub pliku, w zależności od konfiguracji error_log jest ustawiony w pliku php.ini. Korzystając z error_log() funkcji można wysłać logi błędów do określonego pliku lub zdalnego połączenia.

Wysyłanie komunikatów o błędach do siebie e-mail może być dobrym sposobem na uzyskanie powiadomiony o konkretnych błędów.

Wyślij wiadomość o błędzie przez E-Mail

W przykładzie poniżej wyślemy e-mail z komunikatem o błędzie i zakończyć skrypt, gdy wystąpi błąd specyficzny:

<?php
//error handler function
function customError($errno, $errstr) {
  echo "<b>Error:</b> [$errno] $errstr<br>";
  echo "Webmaster has been notified";
  error_log("Error: [$errno] $errstr",1,
  "[email protected]","From: [email protected]");
}

//set error handler
set_error_handler("customError",E_USER_WARNING);

//trigger error
$test=2;
if ($test>=1) {
  trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>

Wyjście z powyższym kodzie powinno być coś takiego:

Error: [512] Value must be 1 or below
Webmaster has been notified

I poczta otrzymana z powyższego kodu wygląda następująco:

Error: [512] Value must be 1 or below

To nie powinien być stosowany ze wszystkimi błędami. Regularne błędy powinny być rejestrowane na serwerze przy użyciu domyślnego systemu rejestrowania PHP.