Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Problem z wyjątkami
Fred1485
post 22.03.2015, 14:46:50
Post #1





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

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


Witam, od razu do rzeczy:

  1. <?php
  2.  
  3. class newException extends Exception { // na potrzeby moich prób druga klasa obsługująca wyjątki
  4. private $code2 = 'Brak kodu';
  5.  
  6. function get() {
  7.  
  8. return $code2;
  9. }
  10. }
  11. require_once('lib/Twig/Autoloader.php');
  12.  
  13. Twig_Autoloader::register();
  14.  
  15. $loader = new Twig_Loader_Filesystem('templates');
  16. $twig = new Twig_Environment($loader, array( 'auto_reload' => true, 'cache' => 'cache')); //tutaj korzystam z TWIGA ale to nie ma nic do rzeczy
  17. $template = $twig->loadTemplate('index.html');
  18.  
  19. //dane do bazy
  20.  
  21. try {
  22.  
  23. $database = @new mysqli(HOST, USER, PASSWORD, DATABASE);
  24.  
  25. if($database->connect_errno) {
  26.  
  27. throw new Exception($database->connect_error, $database->connect_errno);
  28. }
  29. if(!$database->set_charset("utdf8")) {
  30.  
  31. throw new newException('Błąd wyboru kodowania zapytań!');
  32.  
  33. }
  34.  
  35. }
  36.  
  37.  
  38. catch(Exception $error) {
  39.  
  40. echo $template->render(array('text' => $error->getMessage(), 'code' => $error->getCode()));
  41. }
  42. catch(newException $error) {
  43.  
  44. echo $template->render(array('text' => $error->getMessage(), 'code' => $error->get()));
  45.  
  46. }
  47.  
  48. ?>


Skrypt działa jak natura chciała wink.gif Tylko jest problem w tym miejscu:

  1. catch(Exception $error) {
  2.  
  3. echo $template->render(array('text' => $error->getMessage(), 'code' => $error->getCode()));
  4. }
  5. catch(newException $error) {
  6.  
  7. echo $template->render(array('text' => $error->getMessage(), 'code' => $error->get()));
  8.  
  9. }


Zauważcie że jak podam złe dane do bazy to pieknie zostanie obsłużony wyjątek, przecież o to chodzi, ale jeśli specjalnie zmienię tryb kodowania żeby sprawdzić czy klasa newException zostanie wywołana do obsługi tego błędu to już niestety nie działa bo zamiast funkcja catch złapać klasę newException to ona łapię klasę Exception sad.gif

Niby logiczne bo ta klasa dziedziczy po Exception... Jeśli usunę catch z klasą Exception i zostawię samo newException to wszystko pięknie działa! Jest na to jakiś sposób?

P.S Mam nadzieję że zrozumieliście mnie bo trochę pomieszałem biggrin.gif


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post
Skie
post 22.03.2015, 14:49:51
Post #2





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

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


catch łapie pierwszy pasujący exception, jak zmienisz kolejność z

catch(Exception);
catch(newException);

na

catch(newException);
catch(Exception);

to wszytko będzie ładnie działać.
Zasada jest taka, że bloki catch definiujesz od najbardziej specyficznych wyjątków to tych najbardziej ogólnych.


--------------------
Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+
Strona Domowa | Elradia MMORPG
FireFox: make the web better.
Go to the top of the page
+Quote Post
Fred1485
post 22.03.2015, 15:06:23
Post #3





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

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


Rzeczywiście działa wink.gif To jest metoda 'profesjonalna'? Nie chce złych nawyków sobie narobić smile.gif


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post
com
post 22.03.2015, 17:43:35
Post #4





Grupa: Zarejestrowani
Postów: 3 032
Pomógł: 366
Dołączył: 24.05.2012

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


tak dokładnie sie to robi jak napisał kolega powyżej, dbaj jednak o wcięcia bo potem kod staje się dla nas i dla Ciebie nieczytelny. A jeśli plik zawiera tylko sam kod php to na końcu nie dajesz ?> smile.gif
Go to the top of the page
+Quote Post
Fred1485
post 22.03.2015, 17:50:05
Post #5





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

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


No jak znacznika ?> nie zamykaćquestionmark.gif


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post
com
post 22.03.2015, 17:51:19
Post #6





Grupa: Zarejestrowani
Postów: 3 032
Pomógł: 366
Dołączył: 24.05.2012

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


Kiedy w pliku masz sam php to nie zamykasz jak mieszasz z html to zamykasz oczywiście smile.gif
Go to the top of the page
+Quote Post
Fred1485
post 22.03.2015, 17:52:58
Post #7





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

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


Tak tak cos o tym kiedys czytalem ale wyszlo mi to z glowy calkiem bo zawsze troszkęrhtml bylo a teraz szablony to robią

P.s ogarniasz twiga?


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post
com
post 22.03.2015, 17:56:26
Post #8





Grupa: Zarejestrowani
Postów: 3 032
Pomógł: 366
Dołączył: 24.05.2012

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


tak smile.gif
Generalnie polecam zapoznanie się ze standardami przyjętymi w php
https://github.com/php-fig/fig-standards/tr...master/accepted smile.gif
Go to the top of the page
+Quote Post
Fred1485
post 22.03.2015, 18:19:08
Post #9





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

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


No to nie tworząc nowgo tematu taki problem mam:

W przykładowym index.php

  1. echo $template->render(array('text' => 'blablabla'));
  2.  
  3. //tu jakaś reszta kodu a potem
  4.  
  5. echo $template->render(array('text' => 'jakis_tekst_blablabla'));


I na przykład w pliku template chcę to przetworzyć:

  1. <div>{{---PIERWSZY---}}</div>
  2.  
  3. <div>{{---DRUGI}}</div>


Jak widać pola w tablicy nazywają się tak samo więc jak to ogarnąć żeby np w pierwszym divie pierwsze echo się znalazło a w drugim drugie?


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post
com
post 22.03.2015, 18:28:47
Post #10





Grupa: Zarejestrowani
Postów: 3 032
Pomógł: 366
Dołączył: 24.05.2012

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


nie możesz nazwać kluczy tak samo bo jeden drugim nadpisujesz wtedy smile.gif

To tak jakbyś zrobił coś takiego
http://ideone.com/fnkorC
Go to the top of the page
+Quote Post
Fred1485
post 22.03.2015, 18:29:33
Post #11





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

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


No to wiem ale chodzi o to jak to rozwiązać? tylko klucze inaczej nazwać czy można jakoś tablicę do zmiennej przypisać i potem na tym operować? biggrin.gif


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post
com
post 22.03.2015, 19:00:01
Post #12





Grupa: Zarejestrowani
Postów: 3 032
Pomógł: 366
Dołączył: 24.05.2012

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


http://twig.sensiolabs.org/doc/api.html
Tu jest to wszytko opisane smile.gif

Przykłady są i odzwierciadlają twój problem smile.gif
Go to the top of the page
+Quote Post
snerf
post 22.03.2015, 20:05:34
Post #13





Grupa: Zarejestrowani
Postów: 74
Pomógł: 3
Dołączył: 30.03.2014

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


  1. $dwa = array('text' => 'blablabla');
  2.  
  3. //tu jakaś reszta kodu a potem
  4.  
  5. echo $template->render(array('text' => 'jakis_tekst_blablabla',
  6. 'text_dwa' => $dwa));

plik:

{{text_dwa.text}}
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 - 13:54