Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Obsługa wyjątków, Pojawianie się Warning
mimol
post
Post #1





Grupa: Zarejestrowani
Postów: 247
Pomógł: 5
Dołączył: 10.12.2007

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


Napisałem sobie klasę Osoba, aby przetestować na niej działanie wyjątków (chyba nie do końca powinny być tu stosowane, ale nic innego nie przychodzi mi do głowy)
  1. <?php
  2. class Peron{
  3. private $_name;
  4. private $_surname;
  5. private $_age;
  6.  
  7. public function __construct($data){
  8. if(empty($data['name']) || empty($data['surname']) || empty($data['age']) || !is_int($data['age'])){
  9. throw new Exception ('Some data is missing or is wrong');
  10. }
  11. $this->_age=$data['age'];
  12. $this->_surname=$data['surname'];
  13. $this->_name=$data['name'];
  14.  
  15. }
  16. public function __toString(){
  17. return 'Name '.$this->_name.' Surname '.$this->_surname.' Age '.$this->_age;
  18. }
  19. }
  20. $data = array('surname'=>'Smith','name'=>'John','age'=>22);
  21. try{
  22. $person = new Peron();
  23. echo 'Person created';
  24. }catch(Exception $exception){
  25. echo 'Sth goes wrong :( '.$exception;
  26. }
  27.  
  28. ?>

Mimo iż zastosowałem wyjątki dostaję na wyjściu
Kod
Warning: Missing argument 1 for Peron::__construct(), called in C:\xampp\htdocs\wyjatek\index.php on line 23 and defined in C:\xampp\htdocs\wyjatek\index.php on line 7
Sth goes wrong :( exception 'Exception' with message 'Some data is missing or is wrong' in C:\xampp\htdocs\wyjatek\index.php:9 Stack trace: #0 C:\xampp\htdocs\wyjatek\index.php(23): Peron->__construct() #1 {main}

1)Dlaczego pojawia mi się ten warning?(pierwsza linijka) i co zrobić by się nie pojawiał, jak to powinno być poprawnie zrobione?
2)Wydaje mi się, że ten warning zawiera 'ciekawsze' informacje, które sa bardziej pomocne niż to co wypuwa wyjątek:P Czy zawsze do wyjątków trzeba pisać po swojemu informacje? co zrobić aby wyjątek również wypluł Missing argument 1 for Peron::__construct() ?
3)Co zrobić jeśi miałbym kod
  1. //definicja klasy
  2. try{
  3. $person = new Peron();
  4. echo 'Person created';
  5. }catch(Exception $exception){
  6. echo 'Sth goes wrong :( '.$exception;
  7. }
  8. ..............................
  9. ..Bardzo dużo kodu..
  10. ..............................
  11. i teraz chciałbym zapisać Osobę do np piku
  12. file->save($person) // oczywiście chciałbym sprawdzić czy Osoba została poprawnie wygenerowana, a przercież w TRY nie dam całego kodu(którego jest bardzo dużo). W funkcji save nie sprawdzam czy $person jest poprawna bo jeśi nie jest to funkcja nie powinna byc w ogóle uruchamiana.
  13. Rozwiązanie, żeby robić jakieś boole wydaje mi się bez sesnu.

Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Person wymaga podania parametru. Sam to określiłeś w definicji konstruktora. Czyli ma być np. tak:
$person = new Peron($jakiśparametr);
No i brak tego parametru nie jest żadnym wyjątkiem a najzwyklej w świecie WARNINGIEM stąd dostajesz WARNING smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mimol
post
Post #3





Grupa: Zarejestrowani
Postów: 247
Pomógł: 5
Dołączył: 10.12.2007

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


Czyli powinienem stworzyć dodatkowy konstruktor który nie przyjmuje parametrów i tam wyrzucić błąd?
Czy mógbyś odpowiedzieć jak rozwiązać pytanie nr3?

Czy w PHP nie można przeciążyć operatorów?
Jak to inaczej zrobić
  1. public function __construct(){
  2. throw new Exception ('Missing argument for constructor');
  3. }
  4. public function __construct($data){
  5. if(empty($data['name']) || empty($data['surname']) || empty($data['age']) || !is_int($data['age'])){
  6. throw new Exception ('Some data is missing or is wrong');
  7. }
  8.  
  9. $this->_age=$data['age'];
  10. $this->_surname=$data['surname'];
  11. $this->_name=$data['name'];
  12.  
  13. }


Ten post edytował mimol 22.08.2012, 08:55:21
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Poprostu zrób tak:
public function __construct($data=null){
Wówczas możesz podać parametr ale nie musisz.
W php nie możesz przeciązac

Co do pytania nr3 to nie mam bladego pojęcia o co ci chodzi.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mimol
post
Post #5





Grupa: Zarejestrowani
Postów: 247
Pomógł: 5
Dołączył: 10.12.2007

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


Dzięki za odpwiedzieć.
A czy jest jakiś sposób na pzeciążenie (załóżmy, że chciabym również podawać dane nie w tabicy a jako osobne stringi)
Czy w PHP trzebra robić klasy które dziedziczą i tam na nowo definiować konstruktor?

Odnośnie pytania nr3
Chcę sobie utworzyć obiekt $osobia klasy Osoba a potem zapisać go do piku (to już obsługuje inna funkcja)
  1. $osoba = new Osoba;
  2. //Tutaj jest długi kod np, kolorowanie nazwy, zamina wieku na postać rzymska
  3. $plik->save($osoba) // tutaj chcę zapisać $osobę do piku

Chciałbym to obsużyć na wyjątkach (jeśi osoba nie powstanie to nie chce jej zapisać do piku tylko wyswielic stosowny komunikat). Jednak nie widzę sesnu dawać mojego całego kodu w bok Try. Jak to inaczej rozwiązać (nie chcę również sprwadzać w klasie Plik czy $osoba istnieje, klasa Osoba powinna się tym zająć).

Jedyne rozwiązanie jakie przychodzi mi do głowy to własnie
  1. try{
  2. $osoba = new Osoba;
  3. $plik->save($osoba)
  4. //ten długi kod
  5. } catch (Exception $exception){
  6. echo 'cos nie tak';
  7. }
  8.  


Cytat
Obsługa błędów jest to jeden z istotniejszych elementów współczesnych aplikacji. Początkujący programiści często ją bagatelizują, kompletnie nie przejmując się tym, że przy złych ustawieniach na ekranie przeglądarki pojawia się 500 ostrzeżeń PHP, albo załatwiając sprawę najprostszą komendą die(). Wykorzystują to hakerzy, dla których ścieżki dostępu, nazwy plików i numery linii wyświetlane przy komunikatach PHP to znakomite źródło informacji o serwerze, skrypcie oraz umiejętnościach programisty.

Jak wyłączyć w wyjątkach aby nie pojawiała się ścieżka / nr lini?

Ten post edytował mimol 22.08.2012, 09:13:16
Go to the top of the page
+Quote Post
d3ut3r
post
Post #6





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

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


nie wiem czy dobrze rozumiem:

  1. class user{
  2.  
  3. public function __construct($data){
  4.  
  5. if (!is_array($data)){
  6. throw new InvalidArgumentException('Do utworzenia obiektu wymagana jest tablica');
  7. }
  8.  
  9. }
  10.  
  11. }
  12.  
  13. try{
  14.  
  15. $osoba=new user('test');
  16. echo 'to sie nie wykona';
  17.  
  18. } catch (Exception $e){
  19. echo $e->getMessage();
  20. }
  21.  
  22. echo '<br />ale to się wykona';
  23.  


jeżeli nie chcesz aby wyświetliło "ale to się wykona" wówczas możesz wrzucić to w blok try lub w catch zrobić tak:

  1. class user{
  2.  
  3. public function __construct($data){
  4.  
  5. if (!is_array($data)){
  6. throw new InvalidArgumentException('Do utworzenia obiektu wymagana jest tablica');
  7. }
  8.  
  9. }
  10.  
  11. }
  12.  
  13. try{
  14.  
  15. $osobaCreated=true;
  16. $osoba=new user('test');
  17. echo 'to sie nie wykona';
  18.  
  19. } catch (Exception $e){
  20. $osobaCreated=false;
  21. echo $e->getMessage();
  22. }
  23.  
  24. if ($osobaCreated){
  25. echo '<br />ale to się wykona'; //teraz w przypadku exception przy tworzeniu $osoba ten kod też się nie wykona
  26. }


--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post
mimol
post
Post #7





Grupa: Zarejestrowani
Postów: 247
Pomógł: 5
Dołączył: 10.12.2007

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


Pisałem wyżej
Cytat
Rozwiązanie, żeby robić jakieś boole wydaje mi się bez sesnu.
Ale widocznie inaczej się nie da

A czy da się wyłączyć pokazywanie lini w wyjątkach?
Go to the top of the page
+Quote Post
erix
post
Post #8





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Da się wyłączyć raportowanie błędów w ogóle.

Ew. całą aplikację wciskasz w blok try-catch i wyjątkami pluć nie będzie (wszystkie w końcu dziedziczą po Exception).


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #9





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Cytat(erix @ 22.08.2012, 11:17:18 ) *
Ew. całą aplikację wciskasz w blok try-catch i wyjątkami pluć nie będzie (wszystkie w końcu dziedziczą po Exception).

thumbsdownsmileyanim.gif
Go to the top of the page
+Quote Post
erix
post
Post #10





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Skoro nie chce zrozumieć, po co się używa wyjątków, to co poradzić. tongue.gif


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
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 Aktualny czas: 19.08.2025 - 15:32