Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wyjatki, Error Handler, Debugger
Vomit
post
Post #1





Grupa: Zarejestrowani
Postów: 122
Pomógł: 0
Dołączył: 23.01.2006

Ostrzeżenie: (0%)
-----


Witam,

Niedawno, w momencie gdy Bastion, dał do oceny swojego Debuggera, zaczałem zastanawiac sie jaki to ma sens. Mamy przeciez juz Error Handler, gdy dorzucimy do tego Wyjatki wydaje mi sie, ze to wszystko czego potrzeba.

W moim odczuciu, Error Handler, czyli standardowa obsługa bledów, moze byc jeszcze uzbrojona w dodawanie odpowiedniego wpisu do bazy i wysylanie maila do administratora. Mamy funkcje, set_error_handler, dzieki ktorej mozemy zrobic własny, "ładny", dzieki ktoremu mozemy wlasnie dodac wspomniane przeze mnie wyzej rzeczy i zmienic sposob wyswietlania bledu (tak jakby szablon) i wydaje mi sie ze to wszystko.
Ponadto mamy funkcje error_log, ktora zapisze do logow apacha te bledy.
Jest jeszcze trigger_error(), ktora w momencie istnienia wyjatkow troszke traci sens?

Wyjatki... w moim rozumieniu, przydatne przy takich sytuacjach:
  1. <?php
  2. try
  3. {
  4. $q = mysql_query();
  5. if ( !$q ) { throw new Exception('nie udalo sie zapytanie'); }
  6. }
  7. catch(Exception $e )
  8. {
  9. echo $e->__toString();
  10. }
  11. ?>

Obsługuja reszte bledów, ktore wynikna w momencie złego działania skryptu. Takze, mozemy dodac do tego "ładniejsze" wyswietlanie informacji o wyjatku, zapisywanie wyjatkow do bazy i powiadomienie mailem do admina. Mamy takze set_exception_handler, ktorej funkcji istnienia do konca nie rozumiem.

W manualu widziałem ciekawe połaczenie Error Handlera i wyjatkow (ktore sa przeciez zwyklym rozszerzeniem EH).
  1. <?php
  2.  
  3. function handler($errno, $errstr, $errfile, $errline)
  4. {
  5.  print "Error handled!\n";
  6.  throw new Exception($errstr, $errno);
  7. }
  8.  
  9. set_error_handler('handler');
  10.  
  11. try
  12. {
  13.  print 2 / 0; // simple error - division by zero
  14.  print "This will never be printed";
  15. }
  16. catch (Exception $e)
  17. {
  18.  print "Exception catched:\n";
  19.  print "Code: ".$e->getCode()."\n";
  20.  print "Message: ".$e->getMessage()."\n";
  21.  print "Line: ".$e->getLine();
  22. }
  23.  
  24. ?>


Wyjatki obsłuza zarowno typowe wyjatki jak i Error Handlera. Jesli jest to Wyjatek mozemy go zapisac do bazy i wyslac maila, jesli jest to Error, mozemy dodatkowo zapisac go do logow.

Nie widze w takim wypadku sensu istnienia Debuggera, chyba ze ma on jeszcze jakies inne zadania. Jesli sie myle prosze o wyjasnienie...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
dr_bonzo
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


"Tradycyjnie"
  1. <?php
  2. function addData( $file, &$errorStr )
  3. {
  4. if( $conn = mysql_connect( ... ) )
  5. {
  6. if ( mysql_select_db(...) )
  7. {
  8. if ( $data = file_get_contents( $file ) )
  9. {
  10. if ( mysql_query( "INSERT INTO table (some_data) VALUES( '" . $data . "' )" ) )
  11. {
  12. // OK 
  13. return TRUE;
  14. }
  15. else
  16. {
  17. $errorStr = 'zapytanie sie nie powiodlo';
  18. return FALSE;
  19. }
  20. }
  21. else
  22. {
  23.  $errorStr = 'nie mozna bylo wczytac danych';
  24. return FALSE;
  25. }
  26. }
  27. else
  28. {
  29.  $errorStr = 'nie mozna bylo wybrac bazy';
  30. return FALSE;
  31. }
  32.  
  33. }
  34. else
  35. {
  36.  $errorStr = 'nie mozna polaczyc z baza';
  37. return FALSE;
  38. }
  39. }
  40.  
  41.  
  42. $errorStr = '';
  43. if ( addData( 'jakisPlik.dat', $errStr ) )
  44. {
  45. echo "dodalo sie";
  46. }
  47. else
  48. {
  49. echo "nie dodalo sie, bo" . $errStr;
  50. }
  51. ?>


Z wyjatkami (gdyby funkcje same wyrzucaly wyjatki (jak w PDO), ehh)
  1. <?php
  2. function addData( $file )
  3. {
  4. if( $conn = mysql_connect( ... ) === FALSE )
  5. {
  6. throw new DB_Exception( mysql_error());
  7. }
  8.  
  9. if ( mysql_select_db(...) === FALSE)
  10. {
  11. throw new DB_Exception( mysql_error());
  12. }
  13.  
  14. if ( $data = file_get_contents( $file ) === FALSE )
  15. {
  16. throw new File_EXception( ...);
  17. }
  18.  
  19. if ( mysql_query( "INSERT INTO table (some_data) VALUES( '" . $data . "' )" ) === FALSE )
  20. {
  21. throw new DB_Exception( mysql_error());
  22. }
  23. }
  24.  
  25. try
  26. {
  27. addData( 'jakisPlik.dat' );
  28. echo "dodalo sie"
  29. }
  30. catch ( FileExc. $e1 )
  31. {
  32. echo "Nie dodalo sie bo: " . $e->getMessage();
  33. }
  34. catch ( DB_Exc. $e2 )
  35. {
  36. echo "Nie dodalo sie bo: " . $e->getMessage();
  37. }
  38. ?>


Cos w tym stylu, kod oczywiscie nie dziala (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Co wyglada na prostsze? Co jest prostsze, czytelniejsze?
Go to the top of the page
+Quote Post

Posty w temacie


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: 14.10.2025 - 09:18