Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Exception - własna obsługa błędów.
Forum PHP.pl > Forum > PHP > Object-oriented programming
starach
Witam mam oto taki kod php:
  1. <?php
  2. class Error
  3. {
  4. protected $message='Unknown exception';
  5. protected $desc;
  6. protected $code;
  7. protected $file;
  8. protected $line;
  9. protected $trace;
  10.  
  11. public function __construct(string $desc=NULL, int $code=NULL, string $message=NULL)
  12. {
  13. if(!empty($message) && $message !== 0)
  14. {
  15. $this->message = $message;
  16. }
  17. $this->code = $code;
  18. $this->file = __FILE__;
  19. $this->line = __LINE__;
  20. $this->trace = debug_backtrace();
  21. }
  22. final function get_message() {
  23. return $this->message;
  24. }
  25. final function get_desc() {
  26. return $this->desc;
  27. }
  28. final function get_code() {
  29. return $this->code;
  30. }
  31. final function get_file() {
  32. return $this->file;
  33. }
  34. final function get_line() {
  35. return $this->line;
  36. }
  37. final function get_trace() {
  38. return $this->trace;
  39. }
  40. public function __toString()
  41. {
  42. return '<div style="width:90%; margin:0 auto; padding:5px; background-color:#555; border:1px solid #000;">
  43. <b>Exception '.$this->get_code().':</b> '.$this->get_desc().
  44.  '<br><b>File:</b> '.$this->get_file().' <b>Line:</b> '.$this->get_line().
  45.  '<br><b>Error:</b> '.$this->get_desc();
  46. }
  47. }
  48. ?>
Jest to dosłownie odrobinę zmieniona klasa Exception.
Wywołanie błędu:
  1. <?php
  2. public function connect($db_host,$db_user,$db_pass,$db_name,$db_port)
  3. {
  4. try 
  5. {
  6. $this->db_host = $db_host;
  7. $this->db_port = $db_port;
  8. $this->db_name = $db_name;
  9.  if(true == ($this->db_link = @mysqli_connect($db_host,$db_user,$db_pass,$db_name,$db_port)))
  10. {
  11. return true;
  12. } else {
  13. throw new Error('Connection Problem', 0);
  14. }
  15. } catch (Error $e) 
  16. {
  17. die($e->__toString());
  18. }
  19. }
  20. ?>
Wywołuję go specjalnie zmieniając nazwę użytkownika dostępu do bazy na niepoprawną.
Pojawia mi się błąd:
Cytat
Catchable fatal error: Argument 1 passed to Error::__construct() must be an instance of string, string given, called in D:\WWW\orglee\class\class_mysql.php on line 70 and defined in D:\WWW\orglee\class\class_exception.php on line 13

Co jest nie tak ? Dlaczego wyświetla mi ten błąd i co on oznacza ? Na googlach znalazłem tylko ten błąd w CMS Joomla (błąd dotyczył template'a) a rozwiązania błędu nie było.
kwiateusz
a to przypadkiem nie powinno dziedziczyć po Exceptions, tak jak tutaj http://phpedia.pl/wiki.php?title=Wyj%C4%85tki ?
starach
No niby tak ale mam nadzieję,
że można zrobić obsługę wyjątków bez rozszerzania klasy Exception,
poza tym muszę przekazać do klasy 3 wartości a nie jak jest domyślnie 2 z tego co wiem to tam tylko metoda __toString nie jest finalna i można ją napisać na nowo.

edit>
No i rozszerzyłem klasę Exceptions - pokazuje mi się ten sam błąd co w temacie. angrysmiley.gif
DjKermit
1 Rzucać możesz tylko wyjątkami czyli klasa musi dziedziczyć po Exception
2 Wywal typowanie zmiennych w parametrach metod.
3 W potomkach exception możesz przeciążyć konstruktor i dodać sobie 3ci parametr
starach
Dlaczego mam wywalić typowanie ?
W programie którego używam do pisania skryptów jest to czasem dosyć pomocne.
Zwłaszcza jeśli zapomnę jakiego mam użyć parametru.

Wywaliłem typy i zaczął coś działać wreszcie.
To znaczy że w ogóle przy konstruowaniu klas nie mogę definiować typów zmiennych ?
DjKermit
Nie wiem dokładnie na czym to polega i dlaczego tak jest ale przy typowaniu podstawowych typów zmiennych (int bool string ...) wyłażą takie kwiatki, może ktoś inny będzie mądrzejszy i sypnie jakimś wyjaśnieniem.

Dla programu i jego podpowiedzi jakie typy są wymagane powinny wystarczyć komentarze
/**
* opis metody
*
* @param typ $nazwa_zmiennej
*/
Ociu
Odkopie troszke. Nie, nie można. Pewnie zauważyłeś, że nie ma także deklaracji co wzraca dana funkcja. To jest imho grzech php.
w PHP5 zostało wprowadzone zarzucanie parametru jako dany obiekt, np.
  1. <?php
  2. class Core {
  3. public function __construct( MyCrazyObject $object ) {}
  4. }
  5. ?>
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-2024 Invision Power Services, Inc.