Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Obsługa wyjątków
Forum PHP.pl > Forum > Przedszkole
mimol
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.

nospor
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
mimol
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. }
nospor
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.
mimol
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?
d3ut3r
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. }
mimol
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?
erix
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).
SmokAnalog
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
erix
Skoro nie chce zrozumieć, po co się używa wyjątków, to co poradzić. tongue.gif
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.