Wyjątki w PHP

Logo PHP7

Dzisiejszy wpis na blogu poświęcony jest wyjątkom (ang. exception) w języku PHP.

Czym właściwie są wyjątki w PHP?

Otóż służą one do przechwytywania informacji o nienaturalnych sytuacjach, a dzięki temu pozwalają zareagować na błędy w aplikacji.

Przykładowy kod użycia wyjątków:

<?php
class Abc {
  // $liczba powinno być liczbą całkowita
  public function __construct($liczba) {
    if (!is_int($liczba)) {
      throw new InvalidArgumentException('Argument nie jest liczbę całkowitą!');
    }
    echo 'Konstruktor wywołany z prawidłowym argumentem!';
  }
}
try {
  $string = 'aaa';
  $abc= new Abc($string); // wywołujemy konstruktor argumentem który nie jest liczbą całkowitą
  echo 'Obiekt klasy Abc został utworzony';
  } catch (Exception $e) {
  echo $e;
}

Po uruchomieniu powyższego przykładu zobaczymy na ekranie:

Argument nie jest liczbą całkowitą!
NULL

Instrukcja throw

Do wyrzucania wyjątków służy instrukcja throw. Po słowie kluczowym throw powinien znaleźć się obiekt klasy Exception albo klasy dziedziczącej po niej.

Blok try

W bloku try ograniczonym nawiasami klamrowymi powinien znaleźć się kod, który ewentualnie może wyrzucić jakiś wyjątek. Napotkawszy instrukcję throw, kończy się wykonywanie dalszego kodu zarówno w miejscu gdzie został on wywołany w klasie, jak i w bloku try, z którego została wywołana metoda. Jeśli kod wywołujący instrukcję throw nie znajduje się w w bloku try, a więc wyjątek przez nią wyrzucony nie może być przechwycony, PHP generuje błąd krytyczny (Fatal Error).

Blok catch

Po bloku try musi nastąpić minimum jeden blok catch. Blok catch pozwala na przechwycenie zaistniałego wyjątku i wykonanie odpowiednich czynności. Instrukcja catch pobiera jeden argument w postaci „NazwaKlasy $zmienna”, gdzie NazwaKlasy to rodzaj wyjątku (Exception lub pochodna), a $zmienna to zmienna, za pomocą której będziemy odwoływać się do przechwyconego wyjątku. Zazwyczaj jako zmienna zamieszcza się $e

Przykład użycia wielu bloków catch:

<?php
try {
  $bar = new Bar();
  $bar->foo();
} catch (InvalidArgumentException $e) {
  // złapie wszystkie wyjątki typu InvalidArgumentException
  // oraz wyjątki dziedziczące po tym typie
} catch (LogicException $e) {
  // złapie wszystkie wyjątki typu LogicException oraz wyjątki dziedziczące
  // po tym typie (ale bez Invalid ArgumentException, który jest jego
  // dzieckiem i został złapany wcześniej)
} catch (Exception $e)
  // złapie dowolny wyjątek, ale bez LogicException i jego dzieci,
  // ponieważ zostały one złapane w poprzednich blokach catch
}

Właściwości i metody które posiada klasa Exception:

<?php
class Exception
{
protected $message = 'Unknown exception'; // treść wyjątku
protected $code = 0; // kod wyjątku
protected $file; // plik, w którym wystąpił wyjątek
protected $line; // linia, w której wystąpił wyjątek

public function __construct($message = null, $code = 0); // konstruktor

final public function getMessage(); // zwraca wiadomość wyjątku
final public function getCode(); // zwraca kod wyjątku
final public function getFile(); // zwraca nazwę pliku
final public function getLine(); // zwraca numer linii
final public function getTrace(); // zwraca tablicę trace
final public function getTraceAsString(); // zwraca tablicę trace w formie ciągu

/* Do nadpisania */
public function __toString(); // wyjątek w formie ciągu
}
?>

Wbudowane wyjątki w PHP:

  • LogicException
  • BadFunctionCallException
  • BadMethodCallException
  • DomainException
  • InvalidArgumentException
  • LengthException
  • OutOfRangeException
  • RuntimeException
  • OutOfBoundsException
  • OverflowException
  • RangeException
  • UnderflowException