Rodzaje błędów w PHP i ich przyczyny

Autor: Łukasz Świerżewski, dodano: 01-11-2004
Kategoria: Programowanie i tworzenie

Pisząc własne aplikacje trudno uniknąć pomyłek. Zdarzają się one zarówno przy krótkich jak i długich kodach. Często większość webmasterów nie zdaje sobie jednak sprawy z przyczyn owych nieprawidłowości.

Te właśnie nieprawidłowości są tematem naszych rozważań.
Człowiek to nie maszyna i może sobie pozwolić na popełnianie błędów. Należy jednak dbać oto, aby nie popełniać tych błędów zbyt dużo, a nawet starać się je, w miarę doświadczenia, likwidować.
Ów błędy możemy podzielić na kilka odrębnych kategorii, takie jak: błędy lekkie, ciężkie itp. Do pierwszego typu należeć będą głównie drobne literówki lub po prostu stosowanie niedozwolonych znaków w nieodpowiednich miejscach, np. stosowanie „ (cudzysłowie) między wyrażeniem ujętym przez dwa „ (cudzysłowie), bez poprzedzenia go lewym ukośnikiem. Drugi typ będzie już reprezentował zagadnienia dotyczące nieprawidłowej konstrukcji kodu, czyli tzw. błędy logiczne. Można by było jeszcze tak wymieniać, ale nie na tym się skupimy. Postaram się teraz wyjaśnić, co oznaczają najbardziej popularne komunikaty zawieszające poprawne wykonywanie skryptów.

Parse error
To ostrzenie zaliczane jest do błędów składniowych. Jak już wcześniej wspomniałem są to z reguły drobne literówki lub pomyłki. Z reguły wraz z komunikatem podawane są informacje dotyczące miejsca występowania niezgodności (np. ścieżka do pliku i numer linii). Podobne dane wyświetlane są wraz z innymi błędami. Powracając do omawianego typu błędu, zwróćmy uwagę na jego strukturę podaną na przykładzie:
 

Parse error: parse error, expecting `’,” or `’;” in http://localhost/~testy/index.php on line 9



Jak widać powyżej, w treści komunikatu podane są także przykładowe znaki, z którymi może być związany problem, co umożliwia jego szybszy rekonesans i neutralizacje.
Aby uniknąć tego typu błędów należy ustalić sobie pewną zasadę pisania kodu, która dość wyraźnie ukaże nam czy skrypt jest napisany poprawnie. Możemy, więc np. standardowo umieszczać nawiasy otwierające i zamykające w nowych rekordach, itp.

Call to undefined function
Każdy, kto uczy się języka angielskiego nie będzie miał problemu ze zrozumieniem przyczyny błędu. Oczywiście chodzi tu o wywołanie nieistniejącej funkcji. Komunikat ten pojawia się, gdy np. przekręcimy nazwę funkcji lub, czego się powinien wstydzić każdy programista, zapomnieliśmy jakową funkcję zdefiniować. Z reguły w komunikacie jest podawana nazwa funkcji, której nie można odczytać. Jak odnaleźć taką funkcję? Jeśli zawiera się ona w obszernym pliku, to najprostszym sposobem będzie skorzystanie z dowolnego edytora tekstu wyposażonego w wyszukiwarke tekstu. Znając z komunikatu nazwę błędnej funkcji, możemy ją wpisać w okienku wyszukiwania, a następnie po odnalezieniu przeanalizować sytuację i pozbyć się niezgodności.

Cannot instantiate non-existent class
Problem podobny jak powyżej. Dotyczy on wywołania nieistniejącej klasy. Jako jeden z parametrów błędu, wskazywana jest nazwa błędnej klasy. Łatwo ją zlokalizować, tak jak w poprzednim wypadku, a neutralizacja będzie polegała na sprawdzeniu czy rzeczywiście korzystaliśmy z danej klasy i czy jest ona zdeklarowana. Unikanie takich kłopotów polega głównie na rozważnym pisaniu swojego kodu.

Call to a member function on a non-object
Jeśli spróbujesz wywołać metodę jakieś klasy, która nie została przedtem zdeklarowana w ów klasie, to ujrzysz tytułowy komunikat. Należy, zatem pamiętać, z jakiej funkcji korzystamy, a jaka została zdeklarowana. Często problem ten wynika z jakiś drobnych błędów w pisowni, np. literówek. Podobnie jak w poprzednich wypadkach, w parametrze błędy podawane jest położenie wywołanej metody. Sprawdź to i usuń nieprawidłowość.

PHP Timed out!
Komunikat ten jest wyświetlany zazwyczaj, gdy czas wykonania danego skryptu w porównaniu z ustawieniami na serwerze został przekroczony. Jest to najczęściej przyczyną konstruowania długich lub bezsensownych kodów, np. pętle darzące do nieskończoności lub inne tego typu zagadnienia. Lokalizacja takich błędów jest trudna, gdyż skrypt jest wykonywany prawidłowo, zawierać może on jednak niewłaściwe, wspomniane przed chwilą, sformułowania. Neutralizacja problemu sprowadza się, zatem do analizy całego kodu lub, co czasem jest przydatniejsze, napisanie go od nowa.

Headers already sent
Korzystając z różnych funkcji, do których działania konieczna jest wymiana informacji z serwerem trzeba pilnie uważać. Jeśli skorzystamy w jednym skrypcie z kilku takich funkcji, np. przy zapisywaniu zmiennej sesyjnej, a następnie wykonamy przekierowanie za pomocą funkcji header(), to zaistnieje nam tu konflikt. Mianowicie działanie skryptów opiera się na pobieraniu informacji od użytkownika, a następnie przetwarzaniu na serwerze i wysłaniu z powrotem do przeglądarki. Jeśli dane zostaną już wysłane, to nie możemy zastosować funkcji korzystającej z przesyłania danych, gdyż nie możliwe jest podwójne załadowanie strony. Błędu tego możemy uniknąć, stosując odpowiednie funkcje do sterowania buforem danych wyjściowych. Artykuł o korzystaniu z tego typu mechanizmów opisałem już w jednym ze swoich artykułów, dostępnych tutaj.

Division by zero...
Problem ten dotyczy wymaganej w matematyce zasady. Mianowicie, chodzi o dzielenie przez zero. Każdy dobrze wie, że tego typu działanie nie istnieje. Podobnie interpretuje to komputer zwracając stosowny komunikat. Z błędem tym spotykamy się najczęściej, gdy zapisujemy nasze działania w oparciu o zmienne. Może się zdarzyć, iż wskazana zmienna przyjmie wartość pustą lub zerową, co koliduje z prawami matematyki. Aby uniknąć tego rodzaju problemów, przeanalizujmy zawsze nasz program, czy na pewno nie zajdzie okoliczność, w której może wystąpić dzielnik przyjmujący wartość zerową.

Failed to open stream
Przyczyną tego rodzaju błędu jest najczęściej próba otworzenia lub nawiązania połączenia z plikiem lub próba otworzenia katalogu, który nie istnieje. Unikanie tego problemu polega na zastosowaniu funkcji sprawdzającej czy podany plik istnieje, np. file_exists(). Są także inne sposoby, ale wszystko jak zwykle zależy od Twojej pomysłowości.

Wskazane błędy są tylko przykładowe, gdyż im bardziej się rozwija język, tym więcej powstaje nowych klas lub funkcji, a co za tym idzie wydłuża się lista związanych z nimi problemów. Zatem przyczyn błędów często należy szukać w dokumentacji wykorzystywanych zasobów. Dobrym sposobem na ich uniknięcie jest rozważne pisanie skryptów, a po wszelkich zmianach, należy je przetestować. Zapraszam także do przeczytania artykułu o problemach związanych z wykorzystywaniem funkcji obsługi bazy danych MySQL dostępnej tutaj.

Ocena 2.6/5 (52.06%) (471 głosów)

Komentarze:

  • .
    Dodał: nic data: 2009-09-07
    OK


Dodaj komentarz:


Temat:
Twój nick:
Komentarz:
 

Prosimy o kulturę wypowiedzi. Komentarze zawierające niecenzuralne zwroty, bądź obrażające inne osoby będą usuwane. Kod HTML w wypowiedziach jest niedozwolony. Wydawca nie odpowiada za treść komentarzy.