Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Error Handler
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
Ociu
Klasa do obsługi błędów, pochodząca z mojego engine (Valhalla).
Co robimy: tworzymy plik logs.txt w katalogu głównym i nadajemy mu chmod 777.

  1. <?php
  2. define('ERROR_FILE', './logs.txt');
  3.  
  4. class Error
  5. {
  6.  
  7.  /**
  8. * konstruktor
  9. * @param string $msg tresc bledu
  10. * @param string $file plik z bledem
  11. * @param string $line linia z bledem
  12. */ 
  13. public function __construct($msg, $file, $line)
  14. {
  15. if($msg == null) die();
  16. $this -> add2log($msg);
  17. echo '<b>Error on line:</b> ';
  18. $this -> showSource($file, $line, $prev = 0, $next = 0);
  19. echo '<b>Kernel Says:</b> '. $msg .' ';
  20.  
  21. }
  22.  
  23.  /**
  24. * Metoda dodaje informacje o bledzie do logow
  25. * @param string $text tresc bledu
  26. */ 
  27. public function add2log($text)
  28. {
  29. if(!file_exists(ERROR_FILE)) die ('File logs.txt does not exists');
  30.  
  31. $fp = fopen(ERROR_FILE, &#092;"r\");
  32. $oldErrors = fread($fp, filesize(ERROR_FILE));
  33. fclose($fp);
  34.  
  35. $text = &#092;"n\".date('H:i d.m.Y').\" - \". $text;
  36. $fp = fopen(ERROR_FILE, &#092;"a\");
  37. fputs($fp, $text);
  38. fclose($fp);
  39. }
  40.  
  41.  /**
  42. * pobiera logi z pliku
  43. * @param void
  44. */ 
  45. public function getlogs()
  46. {
  47. $file = fopen(ERROR_FILE, &#092;"r\");
  48. flock($file, 1);
  49.  
  50. while($line = fgets($file, 81))
  51. {
  52. echo $line. '<br />';
  53. }
  54.  
  55. flock($file, 3);
  56. fclose($file);
  57. }
  58.  
  59.  /**
  60. * @access: public
  61. * @version 2.0.0
  62. * @license BSD
  63. * @copyright (c) 2003,2004 Cezary Tomczak
  64. * @link http://gosu.pl/software/mygosulib.html
  65. */
  66.  
  67. public function showSource($file, $line, $prev = 10000, $next = 10000)
  68. {
  69.  
  70. $dir = explode(&#092;"/\", $file);
  71. if($dir[0] == '..') return false;
  72. if (!(file_exists($file) && is_file($file)))
  73. {
  74. return trigger_error(&#092;"showSource() failed, file does not exist `$file`\", E_USER_ERROR);
  75. return false;
  76. }
  77.  
  78. $data = ob_get_contents();
  79.  
  80. $data = explode('<br />', $data);
  81. $count = count($data) - 1;
  82.  
  83. $start = $line - $prev;
  84. if ($start < 1)
  85. {
  86. $start = 1;
  87. }
  88. $end = $line + $next;
  89. if ($end > $count) {
  90. $end = $count + 1;
  91. }
  92.  
  93. $highlight_default = ini_get('highlight.default');
  94.  
  95. echo '<table cellspacing=\"0\" cellpadding=\"0\"><tr>';
  96. echo '<td style=\"vertical-align: top;\"><code style=\"background-color: black; color: white;\">';
  97.  
  98. for ($x = $start; $x <= $end; $x++)
  99. {
  100. echo '<a name=\"'.$x.'\"></a>';
  101. echo ($line == $x ? '<font style=\"background-color: black; color: white;\">' : '');
  102. echo str_repeat('&nbsp;', (strlen($end) - strlen($x)) + 1);
  103. echo $x;
  104. echo '&nbsp;';
  105. echo ($line == $x ? '</font>' : '');
  106. echo '<br />';
  107. }
  108. echo '</code></td><td style=\"vertical-align: top;\"><code>';
  109. while ($start <= $end)
  110. {
  111. echo '&nbsp;' . $data[$start - 1] . '<br />';
  112. ++$start;
  113. }
  114. echo '</code></td>';
  115. echo '</tr></table>';
  116.  
  117.  
  118.  
  119. }
  120. } 
  121. ?>


Przykład użycia:
  1. <?php
  2. include('Error.php');
  3. echo new Error('tresc bledu !', __FILE__, __LINE__);
  4. ?>


Edit: wersja skrócona, na dysku leży wersja z set_error_handler winksmiley.jpg
bela
Ociu, zapoznaj się lepiej z funkcją trigger_error" title="Zobacz w manualu PHP" target="_manual :]
Ociu
Cytat(bela_666 @ 2005-05-07 15:58:00)
Ociu, zapoznaj się lepiej z funkcją trigger_error" title="Zobacz w manualu PHP" target="_manual :]

Dzięki, zapoznam się smile.gif
aleksander
  1. <?php
  2. echo new Error
  3. ?>

O ile sie nie myle cus takiego wyświetli "Object #n" Czyż nie mam racji?
dr_bonzo
A czemu definiujesz ERROR_FILE zamiast przekazac ja obiektowi/klasie -- enkapsulacja.

  1. <?php
  2. public function __construct($msg, $file, $line)
  3. {
  4. if($msg == null) return false;
  5. ?>

Czemu konstruktor zwraca false?
bela
Cytat(aleksander @ 2005-05-07 20:45:51)
  1. <?php
  2. echo new Error
  3. ?>

O ile sie nie myle cus takiego wyświetli "Object #n" Czyż nie mam racji?

__toString(); by się przydało smile.gif
dr_bonzo
I wyjatki by sie przydaly -- automatyczne przekazywanie numeru linii i pliku (z backtracka)
Co do __toString()
  1. <?php
  2. print( $obiekt ); // dziala tak jak powinno, a 
  3. print( $obiekt . 'cokolwiek' ); // 'Object #n cokolwiek'
  4. ?>

Czemu?
bela
@dr_bonzo: odpowiedź jest prosta smile.gif a mianowicie rzutowanie typów, w pierwszym przykładzie php wie, że w obiekcie ma __toString i wywołuje jego, a w drugim najpierw rzutuje $obiekt to stringa ( zamiast użyć __toString ) a potem dokleja 'cokolwiek' :]
  1. <?php
  2. class foo {
  3. function __toString() {
  4. return 'Foo';
  5. }
  6. }
  7. $o = new foo();
  8. print $o;  //Foo
  9. print (string)$o;  //Object #1
  10. ?>

:]
Ociu
Cytat(dr_bonzo @ 2005-05-07 21:21:41)
A czemu definiujesz ERROR_FILE zamiast przekazac ja obiektowi/klasie -- enkapsulacja.

  1. <?php
  2. public function __construct($msg, $file, $line)
  3. {
  4. if($msg == null) return false;
  5. ?>

Czemu konstruktor zwraca false?
lol, z rozpędu napisałem. Miało być die(); smile.gif

Cytat(aleksander)
  1. <?php
  2. echo new Error
  3. ?>


O ile sie nie myle cus takiego wyświetli "Object #n" Czyż nie mam racji?
Masz rację.

Cytat(dr_bonzo)
I wyjatki by sie przydaly -- automatyczne przekazywanie numeru linii i pliku (z backtracka)
no.. znam składnię wyjątków, ale nie wiem jak z nich korzystać, gdy dam np:
  1. <?php
  2. throw new Exception('tresc errora');
  3. ?>
wywala błąd...
mike
Cytat(Ociu @ 2005-05-08 08:44:51)
no.. znam składnię wyjątków, ale nie wiem jak z nich korzystać, gdy dam np:
  1. <?php
  2. throw new Exception('tresc errora');
  3. ?>
wywala błąd...

Nie możesz ot tak sobie wyrzucić wyjątku.
Musisz go przechwycić w bloku catch.
  1. <?php
  2. try
  3. {
  4. throw new Exception('tresc errora');
  5. }
  6. catch ( Exception $objException )
  7. {
  8. // zrób coś z obiektem $objException
  9. }
  10. ?>

A co do:
  1. <?php
  2.  
  3. echo new Exception();
  4.  
  5. ?>

to zainteresuj się metodą magiczną __toString() ( o ile piszesz w PHP5 )
dasko
Cytat
I wyjatki by sie przydaly -- automatyczne przekazywanie numeru linii i pliku (z backtracka)

To sie nazywa backtrace biggrin.gif
Ociu
Sposób z wyjątkami:
  1. <?php
  2. class Error
  3. {
  4.  
  5.  /**
  6. * konstruktor
  7. * @param string $msg tresc bledu
  8. * @param string $file plik z bledem
  9. * @param string $line linia z bledem
  10. */
  11. public function __construct($msg, $file, $line)
  12. {
  13. if($msg == null) die();
  14. $this -> add2log($msg);
  15. echo '<b>Error on line:</b> ';
  16. $this -> showSource($file, $line, $prev = 0, $next = 0);
  17. echo '<b>Kernel Says:</b> '. $msg .' ';
  18.  
  19. }
  20. ?>

Zamień na:
  1. <?php
  2. class Error extends Exception
  3. {
  4.  
  5. public function __construct($msg)
  6. {
  7. if(is_null($msg)) die();
  8. $this -> add2log($msg);
  9. echo '<span style=\"font-family: Verdana; font-size:10px\"><b>Error on line:</b>';
  10. $this -> showSource($this -> file, $this -> line, $prev = 1, $next = 0);
  11. echo '<b>Kernel Says:</b> '. $msg .' </span>';
  12.  
  13. }
  14. ?>


wywołanie:
  1. <?php
  2. throw new Error('tresc bledu !');
  3. ?>
NuLL
OT:
@mike_mech - można wyrzucić wyjątek bez try/catch - ja tak robię - z
tym, że trzeba podpiąć handler wyjątków smile.gif
mike
Cytat(NuLL @ 2005-05-08 20:15:57)
OT:
@mike_mech - można wyrzucić wyjątek bez try/catch - ja tak robię - z
tym, że trzeba podpiąć handler wyjątków smile.gif

OT
Ha, to to ja wiem, że można sobie zdefiniować samemu wysokopoziomową obsługę wyjątków:
  1. <?php
  2. function default_exception_handler( $objException )
  3. {
  4. //coś tu jest
  5. }
  6. ?>

Ale miałem na myśli to że korzystając z domyślnej obsługi try/catch jest konieczne.
dasko
Cytat(NuLL @ 2005-05-08 19:15:57)
OT:
@mike_mech - można wyrzucić wyjątek bez try/catch - ja tak robię - z
tym, że trzeba podpiąć handler wyjątków smile.gif

OT smile.gif
@mike_mech: NuLLowi chodziło prawdopodobnie o set_exception_handler" title="Zobacz w manualu PHP" target="_manual, a nie o taką funkcję ;] A poza tym - przykład NuLLa jest czysto teoretyczny i wg mnie bezużyteczny w normalnym skrypcie(NuLL o tym wie winksmiley.jpg) - wyjątek niezłapany == koniec wykonywania skryptu, tyle że jak sie ten handler ustawi, możesz jeszcze podjąć jakieś akcje przed zakończeniem.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.