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%)
-----


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):
  1. <?php
  2. /**
  3.   * Klasa obsługi błędów i nieprzechwyconych wyjątków
  4.   **/
  5. class ErrorHandler
  6. {
  7.    /**
  8.     * Konstruktor 
  9.     *
  10.     * Możemy w tym miejscu ustawić o jakich błędach php ma nas informować
  11.     *
  12.     * @return ErrorHandler
  13.     * @access public
  14.     **/
  15.    public function __construct()
  16.    {
  17.       // trzeba pamiętać że E_ALL ma wartość 2047 podczas gdy 2048
  18.       // a chcemy przecież wiedzieć o wszystkich błędach
  19.       error_reporting( E_ALL | E_STRICT );
  20.    }
  21.  
  22.    /**
  23.     * Obsługa błędów 
  24.     *
  25.     * @param integer Kod błędu
  26.     * @param string Opis błędu
  27.     * @param string Plik w którym wystąpił błąd
  28.     * @param integer Numer linni kodu
  29.     * @return void
  30.     * @access public
  31.     * @throws ErrorException
  32.     **/
  33.    public function handleError( $iErrNo, $sErrStr, $sErrFile, $sErrLine )
  34.    {
  35.       set_exception_handler( array( $this, 'handleException' ) );
  36.  
  37.       // funkcja error handler przechwytuje wszystkie błędy nawet w przypadku
  38.       // wywyołań  funkcji poprzedzonych @ dla których error_reporting = 0
  39.       if ( error_reporting() != 0 )
  40.       {
  41.          throw new ErrorException( $sErrStr, $iErrNo, $sErrFile, $sErrLine );
  42.       } 
  43.    }
  44.    
  45.    /**
  46.     * Obsługa nieprzechwyconych wyjątków 
  47.     *
  48.     * @param Exception
  49.     * @return void
  50.     * @access public
  51.     **/
  52.    public function handleException( $oE )
  53.    {
  54.       echo '<pre>';
  55.       echo $oE->__toString();
  56.       echo '</pre>';  
  57.    }
  58. }
  59.  
  60. ?>

Klasa wyjątku mogłaby wyglądać tak:
  1. <?php
  2. class ErrorException extends Exception
  3. {
  4.    /**
  5.     * Konstruktor 
  6.     *
  7.     * @param string Opis błędu
  8.     * @param integer Kod błędu
  9.     * @param string Plik w którym wystąpił błąd
  10.     * @param integer Numer linni kodu
  11.     * @return ErrorException
  12.     * @access public
  13.     **/
  14.    public function __construct( $sMessage, $sCode, $sFile, $sLine )
  15.    {
  16.       parent::__construct( $sMessage, $sCode );
  17.       $this->file = $sFile;
  18.       $this->line = $sLine;
  19.    }
  20.    
  21.    /**
  22.     * Reprezentacja obiektu w formie łańcucha tekstu
  23.     *
  24.     * @return string
  25.     * @access public
  26.     **/
  27.    public function __toString()
  28.    {
  29.       $sMsg = $this->message . '<br />' . $this->file . '(' . $this->line . ')<br/ >';
  30.       return $sMsg;
  31.    }
  32.      
  33. }
  34.  
  35. ?>

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:
  1. <?php
  2. ...
  3.    public function testErrorAsException()
  4.    {
  5.       set_error_handler( array( new ErrorHandler(), 'handleError' ) );
  6.       $bExceptionCaught = false;
  7.       try
  8.       {
  9.          constant( UNDEFINED_CONSTANT );
  10.       }
  11.       catch ( ErrorException $oE )
  12.       {
  13.          $bExceptionCaught = true;
  14.       }
  15.       $this->assertNoErrors();
  16.       $this->assertTrue( $bExceptionCaught );
  17.       $this->assertEqual( 38, $oE->getLine() );
  18.       $this->assertWantedPattern( '/UNDEFINED_CONSTANT/', $oE->getMessage() );
  19.    }
  20. ...
  21.  
  22. ?>

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
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 - 19:02