Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z wyjątkami
Forum PHP.pl > Forum > Przedszkole
Fred1485
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
Skie
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.
Fred1485
Rzeczywiście działa wink.gif To jest metoda 'profesjonalna'? Nie chce złych nawyków sobie narobić smile.gif
com
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
Fred1485
No jak znacznika ?> nie zamykaćquestionmark.gif
com
Kiedy w pliku masz sam php to nie zamykasz jak mieszasz z html to zamykasz oczywiście smile.gif
Fred1485
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?
com
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
Fred1485
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?
com
nie możesz nazwać kluczy tak samo bo jeden drugim nadpisujesz wtedy smile.gif

To tak jakbyś zrobił coś takiego
http://ideone.com/fnkorC
Fred1485
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
com
http://twig.sensiolabs.org/doc/api.html
Tu jest to wszytko opisane smile.gif

Przykłady są i odzwierciadlają twój problem smile.gif
snerf
  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}}
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.