Witaj, Gościu O nas | Kontakt | Mapa
Wortal Forum PHPEdia.pl Planeta Kubek IRC Przetestuj się!

Dlaczego PHP5?

Bądźmy wyjątkowi

W PHP5 pojawiło się wiele nowości związanych z programowaniem obiektowym. Są to ważne zmiany, ale nawet jeśli w dalszym ciągu chcemy budować programy strukturalnie, warto zastosować wygodniejszy sposób obsługi błędów wprowadzony w PHP5: wyjątki.

Wyobraźmy sobie prostą funkcję, która odczytuje dane konfiguracyjne z pliku i zwraca je w postaci tablicy asocjacyjnej. Podczas większości wywołań otrzymamy prawidłowy wynik i będziemy mogli bez problemu skonfigurować aplikację. Może się jednak zdarzyć, iż zaistnieją wyjątkowe okoliczności: pliku z konfiguracją nie będzie na dysku, nie będziemy mieli wystarczających praw do odczytu lub jego zawartość zostanie zniszczona. Pisząc funkcję, musimy zabezpieczyć się na wspomniane ewentualności. Pierwsza próba implementacji może wyglądać tak, jak na Listingu 1.

Przedstawiony fragment kodu zawiera bardzo poważny problem. Przy obecnej implementacji nie mamy możliwości pokazania użytkownikowi specjalnej strony z komunikatem o błędzie, czy zapisania informacji o problemie w pliku log. Nasz skrypt po prostu zakończy działanie z lakonicznym komunikatem, a co gorsze - wyświetli informacje o fizycznym położeniu programu w systemie plików, co może stanowić wyłom w bezpieczeństwie serwera. Wszystkie opisane nieszczęścia wynikają z faktu, iż zdiagnozowanie błędu (w tym przypadku przez file_exists) i jego obsługa ( die(...)) są ściśle ze sobą powiązane. W takim przypadku lepszym wyjściem jest implementacja przedstawiona na Listingu 2.

Poprawiliśmy trochę sytuację, ponieważ skrypt korzystający z funkcji readConf() sam może zdecydować, jak obsłużyć powstałą sytuację wyjątkową: zapisać błąd do pliku log i przekierować użytkownika na stronę ze stosownym komunikatem, czy też przyjąć domyślne parametry konfiguracyjne.

Wykonany przed chwilą ruch rozwiązał jeden problem, ale natychmiast wygenerował inny. W tej chwili klient funkcji readConf() musi sprawdzać przy każdym wywołaniu, czy wynikiem przypadkiem nie jest wartość null. Wszyscy z doświadczenia wiemy, jak łatwo jest zapomnieć o takim sprawdzeniu.

Wprowadzony w PHP5 model obsługi wyjątków ma wszystkie zalety rozwiązania z Listingu 2 i nie powiela jego wad. Spójrzmy na udoskonaloną wersję omawianej funkcji na Listingu 3.

Konstrukcja throw new Exception() może wyglądać dość egzotycznie, ale tak naprawdę to sposób na zwrócenie specjalnego, alternatywnego wyniku z funkcji. Ten wyjątkowy wynik możemy przechwycić tylko i wyłącznie korzystając z bloku try .. catch. Jeśli wyjątek zostanie rzucony (wyjątki, w przeciwieństwie do standardowych wyników, nie są zwracane, ale właśnie rzucane) poza blokiem try .. catch, to cały skrypt zakończy działanie, dając efekt podobny do die().

Już to krótkie wprowadzenie powinno pokazać, o ile łatwiejsza może być obsługa błędów przy wykorzystaniu wyjątków. Tak naprawdę w mechanizmie tym drzemie o wiele większy potencjał. Aby go w pełni wykorzystać, trzeba odwołać się do nowych cech obiektowych PHP5.

Listing 1. Problematyczny kod bez użycia wyjątków

function readConf()
{
    $cfgFile = '/path/config.cfg';
    $resultArr = array();
    if (file_exists($cfgFile)) {
        return parse_ini_file($cfgFile);
    } else {
        die('Brak pliku z konfiguracją: '.$cfgFile);
    }
}

Listing 2. Alternatywna implementacja bez użycia wyjątków

function readConf()
{
    $cfgFile = '/path/config.cfg';
    $resultArr = array();
    if (file_exists($cfgFile)) {
        return parse_ini_file($cfgFile);
    } else {
        return null;
    }
}

Listing 3. Obsługa błędów przy użyciu wyjątków

<?php
function readConf()
{
    $cfgFile = '/path/config.cfg';
    $resultArr = array();
    if (file_exists($cfgFile)) {
        return parse_ini_file($cfgFile);
    } else {
        throw new Exception('Brak pliku z konfiguracją: '.$cfgFile);
    }
}
try {
    $conf = readConf();
}
catch(Exception $e){
    //tu mozemy zdecydować jak obsłużyć błąd, np.:
    echo $e->getMessage().'<br>';
    echo $e->getTraceAsString();
}
?>
Informacje na podobny temat:
Wasze opinie
Wszystkie opinie użytkowników: (5)
Brakujące listingi
Czwartek 11 Grudzień 2008 8:58:45 am - feft

Widzę, że do dzisiaj nie pojawiły się brakujące listingi - wielka szkoda.
Piotr

listingi
Wtorek 07 Sierpień 2007 8:14:16 am - Olimpia_ona

"Na Listingu 16 zaprezentowaliśmy prosty plik XML, którym będziemy manipulować w kolejnych przykładach."
A gdzie ten listing? Nie ma też listingu 17.
XML / WebServices to interesujący mnie temat, szkoda że z tego artykułu nic się nie dowiedziałam.

super
Czwartek 21 Czerwiec 2007 3:35:34 pm - pawelad <pawelkostomloty_at_op.pl>

Kocham obiektowosc a ostatnio interesuje sie php. Wasza stronka to miod na moje serce. No to macie kolejnego wyznawce.

magiczne metody, przestrzenie nazw
Sobota 11 Marzec 2006 11:38:11 am - mysz

Od wersji php5.1 doszły dwie magiczne metody: __isset i __unset, wywoływane, jak ich nazwa wskazuje, gdy na własności obiektu użyje się funkcji isset() lub unset(). Bardzo przyjemne.

A co do przestrzeni nazw, to mój sposób na implementacje ich w PHP5: http://diary.urzenia.net/?p=261

techniki obiektwe rulezzz
Sobota 28 Styczeń 2006 5:37:00 pm - emp

Ja sobie osbiście nie wyobrażam robić projekt w php bez udogodnien dla technik obiektowych... choć te narazie w wersji 5 wygladaja dość żałośnie to wole to od braku takich udogodnien.. pozatym łapanie wyjątków to podstawowe udogodnienie bez ktorego ciężko się obejśc w większych projektach... tak ja wiem ze takie powstały tylko przy użyciu php5 moze je wykonać jeden człowiek a nie zespół... czcionka jest qrefsko mała ledwo widze co pisze..

Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2020 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System