Najnowsze tutoriale tworzenie stron internetowych
 

PHP Obsługa wyjątków


Wyjątki są używane do zmiany normalnego przepływu skrypt jeśli wystąpi określony błąd.


Co to jest wyjątek

PHP 5 przyszedł nowy obiektowego sposób radzenia sobie z błędami.

Obsługa wyjątków jest używany do zmiany normalnego przepływu wykonanie kodu, jeśli określony błąd (exceptional) występuje warunek. Stan ten nazywany jest wyjątek.

To, co zwykle dzieje się, gdy wyjątek jest wyzwalany:

  • Obecny stan jest zapisany kod
  • Wykonanie kodu przejdzie do predefiniowanego (custom) funkcji obsługi wyjątków
  • W zależności od sytuacji, uchwyt może następnie wznowić wykonanie z zapisanego stanu kodu zakończenia wykonywania skryptu lub kontynuować skrypt z innego miejsca w kodzie

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

  • Podstawowe zastosowanie Wyjątki
  • Tworzenie niestandardowej procedury obsługi wyjątków
  • wiele wyjątki
  • Ponownie powoduje wyjątku
  • Ustawianie obsługi wyjątku najwyższego poziomu

Note: Wyjątki powinny być stosowane tylko w warunkach błędu, i nie powinny być stosowane, aby przejść do innego miejsca w kodzie w określonym punkcie.


Podstawowe użycie Wyjątki

Gdy jest wyjątek, kod nie zostanie wykonany następujący i PHP spróbuje znaleźć pasujący "catch" blok.

Jeśli wyjątek nie zostanie złapany, to błąd krytyczny zostanie wydany z "Uncaught Exception" wiadomości.

Spróbujmy wyjątek bez łapania go:

<?php
//create function with an exception
function checkNum($number) {
  if($number>1) {
    throw new Exception("Value must be 1 or below");
  }
  return true;
}

//trigger exception
checkNum(2);
?>

Powyższy kod będzie się błąd jak poniżej:

Fatal error : Uncaught exception 'Exception'
with message 'Value must be 1 or below' in C:\webfolder\test.php:6
Stack trace: #0 C:\webfolder\test.php(12):
checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6

Spróbuj, rzucać i łapać

Aby uniknąć błędu z powyższego przykładu, musimy stworzyć odpowiedni kod do obsługi wyjątku.

Właściwa kod wyjątku powinien zawierać:

  1. Spróbuj - funkcja użyciu wyjątek powinien być w "try" bloku. Jeśli wyjątek nie wyzwala, kod będzie nadal normalnie. Jeśli jednak wyjątek wyzwalacze, wyjątek jest "thrown"
  2. Rzucać - W ten sposób można wywołać wyjątek. Każdy "throw" musi mieć co najmniej jeden "catch"
  3. Złapać - "catch" blok pobiera wyjątek i tworzy obiekt zawierający informacje o wyjątku

Spróbujmy wywołać wyjątek z ważnego kodu:

<?php
//create function with an exception
function checkNum($number) {
  if($number>1) {
    throw new Exception("Value must be 1 or below");
  }
  return true;
}

//trigger exception in a "try" block
try {
  checkNum(2);
  //If the exception is thrown, this text will not be shown
  echo 'If you see this, the number is 1 or below';
}

//catch exception
catch(Exception $e) {
  echo 'Message: ' .$e->getMessage();
}
?>

Powyższy kod będzie się błąd jak poniżej:

Message: Value must be 1 or below

Przykład wyjaśnia:

powyżej kod zgłasza wyjątek i łapie:

  1. checkNum() funkcja jest tworzony. Sprawdza, czy liczba jest większa niż 1. Jeśli tak, to jest wyjątek
  2. checkNum() jest wywoływana w "try" bloku
  3. Wyjątkiem w checkNum() funkcją jest wyrzucany
  4. "catch" blok pobiera wyjątek i tworzy obiekt ($e) zawierające informacje o wyjątku
  5. Komunikat o błędzie z wyjątkiem odbija się echem poprzez wywołanie $e-> getMessage() z obiektu wyjątku

Jednak jeden sposób, aby ominąć "every throw must have a catch" Zasadą jest, aby ustawić poziom obsługi górną wyjątek do obsługi błędów, które przemknąć.


Tworzenie niestandardowej klasy Exception

Aby utworzyć klasę obsługi wyjątków należy utworzyć specjalną klasę z funkcji, które mogą zostać wykorzystane, gdy wystąpi wyjątek w PHP. Klasa musi być przedłużeniem klasy wyjątków.

Niestandardowa klasa wyjątków dziedziczy właściwości z klasy wyjątków PHP i można dodać niestandardowe funkcje do niego.

Pozwala stworzyć klasę wyjątku:

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
    .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
    return $errorMsg;
  }
}

$email = "[email protected]";

try {
  //check if
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    //throw exception if email is not valid
    throw new customException($email);
  }
}

catch (customException $e) {
  //display custom message
  echo $e->errorMessage();
}
?>

Nowa klasa jest kopią starej klasy wyjątku z dodatkiem errorMessage() funkcji. Ponieważ jest to kopia starej klasy i dziedziczy właściwości i metody ze starej klasy, możemy użyć metody klasy wyjątek jak getLine() i getFile() i getMessage() .

Przykład wyjaśnia:

Powyższy kod generuje wyjątek i łapie go z klasą zwyczaj wyjątek:

  1. customException() klasy jest tworzony jako przedłużenie starej klasy wyjątków. W ten sposób dziedziczy wszystkie metody i właściwości ze starej klasy wyjątków
  2. errorMessage() funkcja jest tworzony. Funkcja ta zwraca komunikat o błędzie, jeśli adres e-mail jest nieprawidłowy
  3. Zmienna $ e-mail jest ustawiony na sznurku, który nie jest prawidłowy adres e-mail
  4. "try" blok jest wykonywany i jest wyjątek, ponieważ adres e-mail jest nieprawidłowy
  5. "catch" blok łapie wyjątek i wyświetla komunikat o błędzie

wiele wyjątkami

Możliwe jest, że skrypt do korzystania z wielu wyjątków w celu sprawdzenia wielu warunków.

Jest możliwość korzystania z kilku bloków if..else, przełącznika lub gniazd wiele wyjątków. Wyjątki te mogą korzystać z różnych klas wyjątków i zwracają różne komunikaty o błędach:

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
    .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
    return $errorMsg;
  }
}

$email = "[email protected]";

try {
  //check if
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    //throw exception if email is not valid
    throw new customException($email);
  }
  //check for "example" in mail address
  if(strpos($email, "example") !== FALSE) {
    throw new Exception("$email is an example e-mail");
  }
}

catch (customException $e) {
  echo $e->errorMessage();
}

catch(Exception $e) {
  echo $e->getMessage();
}
?>

Przykład wyjaśnia:

powyżej kod testuje dwa warunki i zgłasza wyjątek, jeśli dowolny z warunków nie jest spełniony:

  1. customException() klasy jest tworzony jako przedłużenie starej klasy wyjątków. W ten sposób dziedziczy wszystkie metody i właściwości ze starej klasy wyjątków
  2. errorMessage() funkcja jest tworzony. Funkcja ta zwraca komunikat o błędzie, jeśli adres e-mail jest nieprawidłowy
  3. Zmienna $ e-mail jest ustawiony na sznurku, który jest prawidłowy adres e-mail, ale zawiera ciąg "example"
  4. "try" blok jest wykonywany i wyjątek nie zostanie rzucony na pierwszym warunku
  5. Drugi warunek wywołuje wyjątek, ponieważ e-mail zawiera ciąg "example"
  6. "catch" blok łapie wyjątek i wyświetla komunikat o błędzie prawidłowego

Jeśli wyjątek wyrzucane były na customException klasy i nie było customException łapać, łapać tylko wyjątek podstawa wyjątek byłby tam obsługiwane.


Ponowne rzucanie Wyjątki

Czasem, gdy jest wyjątek, może chcesz poradzić inaczej niż standardowy sposób. Możliwe jest wyjątek po raz drugi w "catch" bloku.

Skrypt powinien ukryć błędy systemowe z użytkowników. Błędy systemowe mogą być ważne dla kodera, ale nie mają żadnego zainteresowania użytkownika. Żeby było łatwiej dla użytkownika można ponownie rzucić wyjątek z przyjaznym wiadomości użytkownika:

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = $this->getMessage().' is not a valid E-Mail address.';
    return $errorMsg;
  }
}

$email = "[email protected]";

try {
  try {
    //check for "example" in mail address
    if(strpos($email, "example") !== FALSE) {
      //throw exception if email is not valid
      throw new Exception($email);
    }
  }
  catch(Exception $e) {
    //re-throw exception
    throw new customException($email);
  }
}

catch (customException $e) {
  //display custom message
  echo $e->errorMessage();
}
?>

Przykład wyjaśnia:

Powyższy kod testów czy adres e-mail, zawiera ciąg "example" w nim, jeśli to robi, wyjątek jest ponownie wyrzucony:

  1. customException() klasy jest tworzony jako przedłużenie starej klasy wyjątków. W ten sposób dziedziczy wszystkie metody i właściwości ze starej klasy wyjątków
  2. errorMessage() funkcja jest tworzony. Funkcja ta zwraca komunikat o błędzie, jeśli adres e-mail jest nieprawidłowy
  3. Zmienna $ e-mail jest ustawiony na sznurku, który jest prawidłowy adres e-mail, ale zawiera ciąg "example"
  4. "try" blok zawiera inny "try" blok, aby umożliwić ponowne rzucić wyjątek
  5. Wyjątkiem jest wyzwalany, ponieważ e-mail zawiera ciąg "example"
  6. "catch" blok łapie wyjątek i ponowne generuje "customException"
  7. "customException" zostanie złapany i wyświetla komunikat o błędzie

Jeśli wyjątek nie zostanie złapany w obecnej "try" bloku, będzie szukał bloku catch na "higher levels" .


Ustaw najwyższym poziomie Exception Handler

set_exception_handler() funkcji wyznacza funkcję zdefiniowaną przez użytkownika do obsługi wszystkich przechwycone wyjątków.

<?php
function myException($exception) {
  echo "<b>Exception:</b> " . $exception->getMessage();
}

set_exception_handler('myException');

throw new Exception('Uncaught Exception occurred');
?>

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

Exception: Uncaught Exception occurred

W powyższym kodzie nie było "catch" blok. Zamiast tego, najwyższego poziomu obsługi wyjątku wyzwalany. Ta funkcja powinna być używana do połowu niezłapane wyjątki.


Zasady dotyczące wyjątków

  • Kod może być otoczony w bloku try, aby pomóc złapać potencjalne wyjątki
  • Każdy blok lub spróbować "throw" musi mieć co najmniej jeden odpowiedni blok catch
  • Wiele bloków catch może być używany do połowu różnych klas wyjątków
  • Wyjątkiem może być wyrzucony (or re-thrown) w bloku catch w bloku try

Prosta zasada: jeśli coś wyrzucić, trzeba go złapać.