![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 19.04.2005 Ostrzeżenie: (10%) ![]() ![]() |
Czy jest sposob na obsluge wyjatkow funkcji wbudowanych w php. Chodzi mi o include ('plik'), gdzie po wpisaniu nieistniejacego pliku bede mogl wykonac wlasna funkcje a nie ze parser informuje mnie o tym ze pliku nie znaleziono.
|
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław ![]() |
Niestety - nie.
W tej chwili php nie ma jeszcze pełnej obsługi wyjątków, to znaczy, że większość wbudowanych funkcji nie zwraca wyjątków, tylko errory i notice. W takim przypadku jedynym rozwiazaniem jest napisanie funkcji myInclude i samodzielna obsługa i weryfikacja takich wydażeń. |
|
|
![]()
Post
#3
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Poczytaj o funkcji __autoload() i poszukaj na forum. Temat był poruszany nie raz, jest pewna możliwość, ale jest trochę zabawy.
forum.php.pl :: search :: autoload |
|
|
![]() ![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 562 Pomógł: 15 Dołączył: 8.08.2003 Skąd: Denmark/Odense Ostrzeżenie: (0%) ![]() ![]() |
Może się mylę, ale chyba można coś zwojować używając set_error_handler" title="Zobacz w manualu php" target="_manual()...?
|
|
|
![]()
Post
#5
|
|
Administrator PHPedia.pl Grupa: Developerzy Postów: 1 102 Pomógł: 2 Dołączył: 14.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
Jasne że można, ale to nie to samo co natywna obsługa (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 22.11.2005 Ostrzeżenie: (0%) ![]() ![]() |
Niestety mimo znacznego usprawnienia modelu obiektowego w php5, w tym obsługi wyjątków, większość standardowych funkcji języka, z których korzystamy na co dzień ciągle zorganizowane są w sposób proceduralny i nie zwracają wyjątków w razie niepowodzenia wykonania. Więc nie jest możliwe zamknięcie ich wywołania w bloku try i przechwytywania wyjątków. W takich przypadkach php zwraca błędy różnych poziomów w zależności od błędu.
Korzystając z funkcji set_error_handler mamy możliwość część tych błędów przechwytywać. Oto w jaki sposób przy wykorzystaniu tej funkcji + set_exception_handler ja radzę sobie z obsługą zwykłych błędów za pomocą wyjątków. Pomysł polega na tym, żeby funkcja set-error-handler wyrzucała napisany na tą potrzebę przez nas wyjątek. Dla pewności ustawiamy obsługę nieprzechwyconych wyjątków w set_exception_handler. W bardzo uproszczonej formie wygląda to następująco (kod w php5):
Klasa wyjątku mogłaby wyglądać tak:
Należałoby oczywiście dla każdego typu błędu stworzyć specjalistyczną klasę wyjątku i odpowiednio je obsługiwać. Użycie powyższego kodu sprowadza się już tylko do ustawienia napisanej przez nas funkcji obsługi błędów i przechwycenia odpowiedniego wyjątku:
Podejście jest oczywiście bardzo ubogie i nie wolne od błędów. Trzeba między innymi pamiętać o tym, że nasz error_handler nie będzie przechwytywał błędów typu E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING i części E_STRICT, z którymi nic nie zrobimy. Cytat Poczytaj o funkcji __autoload() i poszukaj na forum. Temat był poruszany nie raz, jest pewna możliwość, ale jest trochę zabawy. forum.php.pl :: search :: autoload Nie bardzo rozumiem co ma wspólnego funkcja __autoload() z pytaniem zadanym przez reekz Z poważaniem, kf P.S. Takiego samego posta na podobne pytanie umieściłem na innym polskim forum. Zdecydowałem się zamiast podać linka napisać go tutaj jeszcze raz. Mam nadzieje, że jest to zgodne z tutejszymi zasadami. (IMG:http://forum.php.pl/uwaga.gif) poprawiam --- nospor |
|
|
![]()
Post
#7
|
|
Developer Grupa: Moderatorzy Postów: 2 844 Pomógł: 20 Dołączył: 25.11.2003 Skąd: Olkusz ![]() |
Cytat(areekz @ 2005-11-07 12:48:28) Czy jest sposob na obsluge wyjatkow funkcji wbudowanych w php. Chodzi mi o include ('plik'), gdzie po wpisaniu nieistniejacego pliku bede mogl wykonac wlasna funkcje a nie ze parser informuje mnie o tym ze pliku nie znaleziono.
Jak zwykle inprowizuje i nie sprawdzalem tego.. ale powino dzialac. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 476 Pomógł: 1 Dołączył: 5.11.2005 Skąd: Bieruń city Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 22.11.2005 Ostrzeżenie: (0%) ![]() ![]() |
To że na każdy problem istnieje wiele rozwiązań, nie znaczy że są one dobre.
Jednym z podstawowych zadań i ogromną zaletą wyjątków jest oddzielenie kodu odpowiedzialnego za obsługę błędów od kodu aplikacji. Pozbycie się uciążliwego i koszmarnego do opanowania w bardziej skomplikowanych przypadkach tzw. inline error checking, na rzecz bloku try. Więc propozycje typu: Cytat
Cytat
Nie są najlepszym rozwiązaniem i mijają się z celem. Zamiast pomagać, wprowadzają niepotrzebne zamieszanie utrudniając czytanie kodu. |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 476 Pomógł: 1 Dołączył: 5.11.2005 Skąd: Bieruń city Ostrzeżenie: (0%) ![]() ![]() |
napisz wlasny odpowiednik funkcji:
(IMG:http://forum.php.pl/uwaga.gif) poprawiam --- nospor |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 22.11.2005 Ostrzeżenie: (0%) ![]() ![]() |
Cytat(dtb @ 2005-11-28 14:12:22) napisz wlasny odpowiednik funkcji:
To też nie jest najlepszy pomysł i nie polecałbym go. Zaśmieca kod, który staje się niezrozumiały dla innych programistów, ze względu na przysłanianie standardowych funkcji własnymi nazwami. |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 204 Pomógł: 0 Dołączył: 26.12.2003 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#13
|
|
Grupa: Moderatorzy Postów: 1 566 Pomógł: 37 Dołączył: 14.05.2003 Skąd: Kraków ![]() |
Cytat(mike_mech @ 2005-11-07 12:57:20) Poczytaj o funkcji __autoload() i poszukaj na forum. Temat był poruszany nie raz, jest pewna możliwość, ale jest trochę zabawy. forum.php.pl :: search :: autoload Funkcja __autoload() służy do automatycznego ładowania pliku. Koledze chodzi właśnie o własne błęd z wyjątkami. pozdrawiam |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 204 Pomógł: 0 Dołączył: 26.12.2003 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
Ja drążę wypowiedź Krzystofa f. z ciekawym pomysłem.
Próbowałem go zastosować ale napotkalem na pewien problem:
gdy handleError wyrzuca wyjątek to wykonywanie metody się konczy, a poniewaz nie zwrocila true to nie jest wykonywany dalszy kod. Ma ktoś pomysl jak to obejść? |
|
|
![]()
Post
#15
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Co ty chcesz obchodzic? Jak metoda wyrzuca wyjatek to nie moze jednoczesnie zwracac wartosci. Ta funkcja zamienia errory na wyjatki, ktore jest duzo prosciej obslugiwac. Obsluga wyjatkow + wyjatki oddziela obsluge "bledow" aplikacji o jej normalnego kodu. Nie musisz zwracac wartosci np. -1, NULL gdy nastapi jakis blad, tylko wyrzucach wyjatek i go lapiesz. Unikasz wielu zagniezdzonych ifow ktore testuja wynik funkcji na obecnosc bledow. Jak poznasz dobrze wyjatki to zobaczysz, ze nie bedziesz bez nich mogl zyc (no dobra -- chociaz pisac (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ).
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 204 Pomógł: 0 Dołączył: 26.12.2003 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
bonzo, nie zrozumiałeś problemu. Wszystko od trzeciego zdania praktycznie nie wnosi nic do dyskusji i co więcej opiera się na błędnym założeniu.
Podejrzewam, że tylko krzychu zaczaci o czym myslę;) W obecnej postaci ten sposób jest nie do zaakceptowania, ponieważ zatrzymuje egzekucję kodu po błędzie pomimo tego, że wyjątek został obslużony przez handleException (zatrzymuje go handleError). Ten post edytował Ozzy 4.12.2005, 11:19:50 |
|
|
![]()
Post
#17
|
|
Grupa: Moderatorzy Postów: 1 566 Pomógł: 37 Dołączył: 14.05.2003 Skąd: Kraków ![]() |
I kod powinien być zatrzymany. Jeśli masz błąd w aplikacji, to jaki jest cel dalszej egzystencji uruchamiania strony ?
A co do wzracania true. Jeżeli nie ma błędu, lub error_reporting nie jest ustawiony, wtedy moteda nie jest używana, czyli wzraca true. |
|
|
![]()
Post
#18
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Ozzy: Maual sie klania - http://pl.php.net/manual/en/function.set-e...ion-handler.php
Cytat Sets the default exception handler if an exception is not caught within a try/catch block. Execution will stop after the exception_handler is called. Wg. mnie exception handler nie powinien byc w ogole uzywany - wyrzucane wyjatki trzeba lapac i obslugiwac w kodzie programu. Przeciez brak polaczenia z baza nie powinien zamykac aplikacji -- przeciez mozna np. content wczytac z cache'u w plikach. Cytat Wszystko od trzeciego zdania praktycznie nie wnosi nic do dyskusji i co więcej opiera się na błędnym założeniu. Hmmm, a ktore to bledne zalozenie?Cytat gdy handleError wyrzuca wyjątek to wykonywanie metody się konczy to prawda -- tak dzialaja wyjatki.Cytat a poniewaz nie zwrocila true to nie jest wykonywany dalszy kod. ktory dalszy kod? ten po wywolaniu funkcji ktora wyrzucila error, co spowodowalo wywolanie error_handlera? A jak lapiesz ten wyjatek? Przechwytujesz go exc. handlerem? |
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 204 Pomógł: 0 Dołączył: 26.12.2003 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
W ogóle nie rozumiecie jaki jest problem, spróbujcie napisać to u siebie i sprawdzić jak działa...
W tej postaci jakiej jest, nawet niezłapany NOTICE zatrzymuje całą aplikację, co więcej, try trzeba by było robić dla kazdej linijki, ponieważ każdy nieobslużony błąd powodowalby zatrzymanie aplikacji, a zwykly błąd nie powoduje zatrzymania i nie powinien. A taki jest Ociu sens, że większośc aplikacji potrafi się wykonać nawet gdy wystąpi błąd i nie powinna być zatrzymana. Jak dla mnie cała koncepcja zamiany błędów na wyjątki w tej postaci jest błędna i ma więcej wad niż zalet. Nie widze dla niej zastosowania. Ten post edytował Ozzy 4.12.2005, 12:04:36 |
|
|
![]()
Post
#20
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Cytat nawet niezłapany NOTICE zatrzymuje całą aplikację, co więcej, try trzeba by było robić dla kazdej linijki Bo trzeba go lapac! Nie try dla kazdje linijki - bo to nie sa errory tylko wyjatki - mozesz blokiem try objec wieksza ilosc kodu.Dodaj do kodu krzysztofa i zobacz jak to dziala. |
|
|
![]()
Post
#21
|
|
Grupa: Zarejestrowani Postów: 204 Pomógł: 0 Dołączył: 26.12.2003 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
No to powodzenia w łapaniu każdego błędu.
|
|
|
![]()
Post
#22
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Juz nie wiem jak ci wytluamczyc obsluge wyjatkow - dorwij kilka tutoriali, ksiazek, poczytaj, popatrz z na kod z wyjatkami...
Tu http://northslope.lap.pl/dev/jaco/wyjatki.phps jest przykladowy kod (nie dzialjacy!) prezentujacy wyjatki i ich oblsuge. |
|
|
![]()
Post
#23
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 22.11.2005 Ostrzeżenie: (0%) ![]() ![]() |
Easy guys... Proszę Was, taka dyskusja do niczego nie prowadzi.
Jak zwykle każdy ma trochę racji i wszystko da się rozwiązać, ale po kolei. Cytat Funkcja __autoload() służy do automatycznego ładowania pliku. Koledze chodzi właśnie o własne błęd z wyjątkami. Tak ale jej wykorzystanie do niczego nie prowadzi w tym konkretnym przypadku. Funkcja ta jest wywoływana w przypadku kiedy nie została znaleziona definicja klasy, a nie dołączany plik. Cytat Wszystko ok, tyle że klasa ErrorException już istnieje No jakby nie było. A ta skąd się wzięła? Ktoś wie gdzie jest jej definicja? Swoją drogą kolejny przykład, który utwierdza mnie w przekonaniu, że brak przestrzeni nazw w php jest dużym minusem i powinny się pojawić w 6. Cytat W obecnej postaci ten sposób jest nie do zaakceptowania, ponieważ zatrzymuje egzekucję kodu po błędzie pomimo tego, że wyjątek został obsłużony przez handleException (zatrzymuje go handleError). Jest to prawdę mówiąc dobra uwaga. Mój przykład wygląda tak, ponieważ osobiście mam bardzo restrykcyjne podejście do błędów. Staram się z takim samym naciskiem eliminować błędy typu fatal jak i notice. Myślę że takie podejście się sprawdza, ale rzeczywiście php w stosunku do pewnych błędów zachowuje się inaczej i pozwala aby wykonywanie kodu było kontynuowane. Decydując się na wyjątki w pewnym sensie zrezygnowaliśmy z takiej możliwości. Czy to źle? czy dobrze? ..tutaj każdy będzie miał swoje zdanie. Spróbujmy zrobić mały refactoring, aby rozwiązać problem jaki ma Ozzy. Po pierwsze wyrzucając wyjątek w bloku try, nie mamy możliwości kontynuowania kodu w tymże bloku. Aplikacja będzie działać dalej, przechodząc do odpowiedniego bloku catch. Więc będziemy musieli zrezygnować z bloku try (tam gdzie nie jest konieczne jego używanie) i polegać na funkcji set_exception_handler. Potrzebna zmiana dotyczy metody ErrorHandler::handleError()
Teraz np. kod
wykona się w całości. Natomiast ten
z wiadomych przyczyn nie. Jeśli spodziewalibyśmy się jakiegoś konkretnego wyjątku, który wymaga obsłużenia należałoby oczywiście bezwzględnie zamknąć taki kod w bloku try. |
|
|
![]()
Post
#24
|
|
Grupa: Zarejestrowani Postów: 204 Pomógł: 0 Dołączył: 26.12.2003 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
No i pięknie. Jak widać jest to możliwe:)
Jak będę miał trochę czasu to napiszę prototyp i potestuję, ale pomysł wydaje się jak najbardziej działający. Na użycie operatora bitowego też bym nie wpadł(IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Dzięki Krzysiek:) Jedno pytanie jeszcze: dlaczego set_exception_handler jest w handleError, a nie na przykład w konstruktorze? Przy kilku błędach będzie kilkakrotnie wywoływana, czyż nie? ErrorException został wprowadzony do SPL od php 5.1 i na razie nie ma go w dokumentacji, jedynie w Reflection API. Nawet buga raportowałem, bo był jeszcze niedopracowany:) Jest też możliwość korzystania z obydwu zalet, tzn. z bloku try i "cichego" radzenia sobie z błędem - można utworzyć publiczną metodę klasy ErrorHandler, która zmieniałaby zachowanie metody handleError, raz wyrzucając wyjątek, a raz wywołując handleException... Ten post edytował Ozzy 13.12.2005, 12:33:25 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 17:00 |