Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Error Handler, Klasa, PHP 5
Ociu
post 7.05.2005, 14:39:04
Post #1





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




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

Ten post edytował Ociu 8.05.2005, 08:45:24
Go to the top of the page
+Quote Post
bela
post 7.05.2005, 14:58:00
Post #2


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

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


Ociu, zapoznaj się lepiej z funkcją trigger_error" title="Zobacz w manualu PHP" target="_manual :]


--------------------
Go to the top of the page
+Quote Post
Ociu
post 7.05.2005, 15:08:32
Post #3





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




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
Go to the top of the page
+Quote Post
aleksander
post 7.05.2005, 19:45:51
Post #4





Grupa: Przyjaciele php.pl
Postów: 742
Pomógł: 0
Dołączył: 14.12.2003
Skąd: Gdańsk, Trójmiasto

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


  1. <?php
  2. echo new Error
  3. ?>

O ile sie nie myle cus takiego wyświetli "Object #n" Czyż nie mam racji?
Go to the top of the page
+Quote Post
dr_bonzo
post 7.05.2005, 20:21:41
Post #5





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

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


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?


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
bela
post 7.05.2005, 20:40:08
Post #6


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

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


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


--------------------
Go to the top of the page
+Quote Post
dr_bonzo
post 7.05.2005, 21:07:31
Post #7





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

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


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?


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
bela
post 7.05.2005, 22:13:45
Post #8


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

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


@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. ?>

:]


--------------------
Go to the top of the page
+Quote Post
Ociu
post 8.05.2005, 08:44:51
Post #9





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




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...

Ten post edytował Ociu 8.05.2005, 08:58:57
Go to the top of the page
+Quote Post
mike
post 8.05.2005, 09:17:34
Post #10





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


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 )
Go to the top of the page
+Quote Post
dasko
post 8.05.2005, 10:01:11
Post #11





Grupa: Zarejestrowani
Postów: 179
Pomógł: 0
Dołączył: 9.11.2004

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


Cytat
I wyjatki by sie przydaly -- automatyczne przekazywanie numeru linii i pliku (z backtracka)

To sie nazywa backtrace biggrin.gif
Go to the top of the page
+Quote Post
Ociu
post 8.05.2005, 20:09:54
Post #12





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




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. ?>
Go to the top of the page
+Quote Post
NuLL
post 8.05.2005, 20:15:57
Post #13





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


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


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
mike
post 8.05.2005, 20:31:33
Post #14





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


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.
Go to the top of the page
+Quote Post
dasko
post 8.05.2005, 22:13:18
Post #15





Grupa: Zarejestrowani
Postów: 179
Pomógł: 0
Dołączył: 9.11.2004

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


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

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

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 05:55