Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> obsluga wyjatkow, obsluga wyjatkow
areekz
post
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 19.04.2005

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
krzysztof f.
post
Post #2





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()
  1. <?php
  2.  public function handleError( $iErrNo, $sErrStr, $sErrFile, $sErrLine )
  3.  {
  4. set_exception_handler( array( $this, 'handleException' ) );
  5.  
  6. if ( error_reporting() != 0 )
  7. {
  8.  if ($iErrNo & (E_NOTICE | E_USER_NOTICE)) {
  9. $this->handleException( new NoticeErrorException( $sErrStr, $iErrNo, $sErrFile, $sErrLine ) );
  10.  } else if ($iErrNo & (E_WARNING | E_USER_WARNING | E_CORE_WARNING | E_COMPILE_WARNING)) {
  11. $this->handleException( new WarningErrorException( $sErrStr, $iErrNo, $sErrFile, $sErrLine ) );
  12.  } else if ($iErrNo & (E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR)) {
  13. throw new FatalErrorException( $sErrStr, $iErrNo, $sErrFile, $sErrLine ); 
  14.  } else {
  15. throw new UnknownErrorException( $sErrStr, $iErrNo, $sErrFile, $sErrLine );
  16.  }
  17.  
  18. } 
  19.  }
  20. ?>


Teraz np. kod
  1. <?php
  2. set_error_handler( array( new ErrorHandler(), 'handleError' ) );
  3. include 'wrong_file.inc.php';
  4. echo 'Kolejne instrukcje';
  5.  
  6. ?>

wykona się w całości. Natomiast ten
  1. <?php
  2. set_error_handler( array( new ErrorHandler(), 'handleError' ) );
  3. trigger_error( 'Błąd', E_USER_ERROR );
  4. echo 'Kolejne instrukcje';
  5.  
  6. ?>

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.
Go to the top of the page
+Quote Post

Posty w temacie
- areekz   obsluga wyjatkow   7.11.2005, 11:48:28
- - DeyV   Niestety - nie. W tej chwili php nie ma jeszcze p...   7.11.2005, 11:57:00
- - mike_mech   Poczytaj o funkcji __autoload() i poszukaj na foru...   7.11.2005, 11:57:20
- - bregovic   Może się mylę, ale chyba można coś zwojować używaj...   7.11.2005, 15:57:46
- - bela_666   Jasne że można, ale to nie to samo co natywna obsł...   7.11.2005, 18:04:39
- - krzysztof f.   Niestety mimo znacznego usprawnienia modelu obiekt...   24.11.2005, 15:03:37
- - hwao   Cytat(areekz @ 2005-11-07 12:48:28)Czy jest s...   24.11.2005, 15:59:37
- - dtb   [PHP] pobierz, plaintext <?phpif (file_exis...   24.11.2005, 16:03:30
- - krzysztof f.   To że na każdy problem istnieje wiele rozwiązań, n...   28.11.2005, 14:23:15
- - dtb   napisz wlasny odpowiednik funkcji: [PHP] pobierz, ...   28.11.2005, 15:12:22
- - krzysztof f.   Cytat(dtb @ 2005-11-28 14:12:22)napisz wlasny...   29.11.2005, 11:48:29
- - Ozzy   Wszystko ok, tyle że klasa ErrorException już istn...   4.12.2005, 00:06:40
- - Ociu   Cytat(mike_mech @ 2005-11-07 12:57:20)Poczyta...   4.12.2005, 08:51:06
- - Ozzy   Ja drążę wypowiedź Krzystofa f. z ciekawym pomysłe...   4.12.2005, 10:41:40
- - dr_bonzo   Co ty chcesz obchodzic? Jak metoda wyrzuca wyjatek...   4.12.2005, 10:56:30
- - Ozzy   bonzo, nie zrozumiałeś problemu. Wszystko od trzec...   4.12.2005, 11:09:00
- - Ociu   I kod powinien być zatrzymany. Jeśli masz błąd w a...   4.12.2005, 11:25:31
- - dr_bonzo   Ozzy: Maual sie klania - http://pl.php.net/manual/...   4.12.2005, 11:42:29
- - Ozzy   W ogóle nie rozumiecie jaki jest problem, spróbujc...   4.12.2005, 11:53:21
- - dr_bonzo   Cytatnawet niezłapany NOTICE zatrzymuje całą aplik...   4.12.2005, 12:04:47
- - Ozzy   No to powodzenia w łapaniu każdego błędu.   4.12.2005, 12:35:42
- - dr_bonzo   Juz nie wiem jak ci wytluamczyc obsluge wyjatkow -...   4.12.2005, 12:42:25
- - krzysztof f.   Easy guys... Proszę Was, taka dyskusja do niczego ...   6.12.2005, 12:46:32
- - Ozzy   No i pięknie. Jak widać jest to możliwe:) Jak będę...   13.12.2005, 01:20:18


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.10.2025 - 03:41