Piąta odsłona PHP została zaprezentowana światu w roku 2004. Zmiany wprowadzone do języka były wręcz rewolucyjne. Programowanie obiektowe w PHP przestało budzić uśmiech politowania, a szereg usprawnień i nowych funkcjonalności robił ogromne wrażenie. Mimo iż od premiery “obiektowego PHP” minęło ponad sześć lat, nadal niektóre – nawet te podstawowe – funkcjonalności pozostają niezrozumiałe i albo kurzą się w zaciszu manuala albo są wykorzystywane w sposób wołający o pomstę do nieba. Taki właśnie los spotkał wyjątki.
Zanim zaczniemy poznawać wyjątki dostępne w ramach SPL, warto wiedzieć po co w ogóle one powstały. Ich powstaniu przyświecał jeden cel – możliwość sterowania przepływem aplikacji w obliczu błędu. A po naszemu – nawet jeśli coś nie zadziała, aplikacja nie wyłoży się koncertowo, tylko będzie próbowała działać w ograniczonym zakresie.
Poza standardową klasą Exception, będącą nadrzędną klasą dla wyjątków, w PHP (a dokładniej w SPL) mamy dostępnych kolejnych trzynaście klas wyjątków. Każda z nich powstała w innym celu.
BadFunctionCallException
Wyjątek BadFunctionCallException powstał w celu zasygnalizowania niepopranego wywołania funkcji. Co należy przez to rozumieć? Najprościej będzie to wytłumaczyć na przykładzie.
try {
callMe();
} catch(BadFunctionCallException $e) {
echo $e;
}
function callMe()
{
$args = func_num_args();
if($args < 2) {
throw new BadFunctionCallException('Za mało argumentów');
}
}
BadFunctionCallException można również rzucać w przypadku braku niepoprawnej nazwy funkcji do wywołania.
BadMethodCallException
Obiektowy odpowiednik poprzedniej klasy.
try {
$foo = new Foo();
$foo->niesitniejacaMetoda();
} catch(BadMethodCallException $e) {
echo $e;
}
class Foo
{
public function __call($method, $args)
{
switch($method) {
case 'foo':
/* do magic */
break;
default:
throw new BadMethodCallException('Nie ma takiej metody');
}
}
}
DomainException
Najmniej zrozumiały i najmniej potrzebny (póki co) wyjątek dostępny w PHP. Wyjątek DomainException powinien zostać zgłoszony w momencie próby skorzystania z danych nienależących do bieżącej domeny. Jak na razie na temat tego wyjątku toczą się akademickie dyskusje, z których można dowiedzieć się, że np. obiekt Foo nie znajduje się w domenie dni tygodnia. W przypadku PHP nie spotkałem się jeszcze z praktycznym zastosowaniem tej klasy.
InvalidArgumentException
Wyjątek zgłaszany w momencie otrzymania niespodziewanego/niepoprawnego argumentu.
try {
$foo = new Foo();
$foo->bar('abc');
} catch(InvalidArgumentException $e) {
echo $e;
}
class Foo
{
public function bar($arg)
{
if(!is_numeric($arg)) {
throw new InvalidArgumentException('Niepoprawny argument');
}
}
}
LengthException
Ten typ wyjątku zgłaszany jest w przypadku odebrania danych o niepoprawnej długości. Niepoprawna długość danych oznacza tutaj nieprawidłowy rozmiar odebranego pliku, błędną ilość danych przesłanych ze strumienia, czy też nieoczekiwaną wielkość tablicy.
try {
$a = array(123, 234, 345);
// z jakiegos powodu tablica musi zawierać dwa elementy
if(count($a) != 2) {
throw new LengthException('Niepoprawna wielkość tablicy');
}
} catch(LengthException $e) {
echo $e;
}
LogicException
Kolejny klasa wyjątku, z której nie będziemy zbyt często korzystać. Zgłaszany jest w momencie, gdy wyrażenie logiczne oznacza fałsz.
Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...
Zwiń
Czytaj na blogu autora...