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. |
|
|
|
![]() ![]() |
|
Aktualny czas: 23.12.2025 - 02:42 |