Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nieprzechwycony wyjątek. Czemu?
Forum PHP.pl > Forum > PHP > Object-oriented programming
Fipaj
Włączam sobie zalążek mojej aplikacji, i widzę:
Kod
"Fatal error: Uncaught exception 'Exception' with message 'Nie można odczytać sesji' in /usr/local/apache2/htdocs/simplog/biblioteki/model/sesje.php:25 Stack trace: #0 /usr/local/apache2/htdocs/simplog/biblioteki/model/sesje.php(25): sesje::odczytaj() #1 /usr/local/apache2/htdocs/simplog/index.php(20): sesje->odczytaj('tak') #2 {main} thrown in /usr/local/apache2/htdocs/simplog/biblioteki/model/sesje.php on line 25"
. Nie przechwycony wyjątek...

Oto plik sesje (kawałek):
  1. <?php
  2.  
  3. class sesje {
  4.  
  5. function __construct () {
  6. if (!session_start ()) {
  7. throw new Exception ('Nie można zainicjować sesji');
  8. }
  9. }
  10. function nowa ($nazwa, $wartosc) {
  11. if (!$_SESSION[$nazwa] = $wartosc) {
  12. throw new Exception ('Nie można utworzyć sesji');
  13. }
  14. }
  15. function zmien ($nazwa, $wartosc) {
  16. if (!$_SESSION[$nazwa] = $wartosc) {
  17. throw new Exception ('Nie można zmienić sesji');
  18. }
  19. }
  20. function odczytaj ($nazwa) {
  21. if (isset ($_SESSION[$naszwa])) {
  22. return $_SESSION[$nazwa];
  23. }
  24. else {
  25. throw new Exception ('Nie można odczytać sesji');
  26. }
  27. }
  28. function usun ($nazwa) {
  29. unset ($_SESSION[$nazwa]);
  30. }
  31. }
  32.  
  33. ?>


A to klasa model:
  1. <?php
  2.  
  3. class model {
  4. public $wynik;
  5. public $bds;
  6. public $sesje;
  7.  
  8. function __construct (MySQL $bd, sesje $sesje) {
  9. $this->bds = $bd;
  10. $this->sesje = $sesje;
  11. }
  12.  
  13. function wykonaj ($metoda) {
  14. try {
  15. $this->wynik = $metoda;
  16. }
  17. catch (Exception $e) {
  18. die ($e->getMessage ());
  19. }
  20. return $this->wynik;
  21. }
  22. }
  23.  
  24. ?>


No i wywołanie:
  1. <?php
  2. $model = new model (new MySQL ('localhost', 'root', '', 'testy'), new sesje ());
  3. $model -> wykonaj ($model -> sesje -> nowa ('tak', 'nie'));
  4. $tak = $model -> wykonaj ($model -> sesje -> odczytaj ('tak'));
  5. ?>


Czemu nie łapie wyjątku?

Dzięki za odpowiedzi!

PS. Skrypt już działa - była mała literówka. Ale znów jeśli zmienię nazwę zmiennej, mamy w pliku sesje zmienną "$naszwa" zamiast "$nazwa" to znów nie przechwyca rzuconego wyjatku....
dr_bonzo
1. Zobacz gdzie wywolujesz metode wyrzucajaca wyjatek:
  1. <?php
  2. $tak = $model -> wykonaj ($model -> sesje -> odczytaj ('tak'));
  3. ?>

a przechwytujesz go w $model->wykonaj(...), tyko ze on tam nie dochodzi, bo ta metoda przyjmuje jako parametr wartosc zwrocona przez $model -> sesje -> odczytaj ('tak') a wyjatek ucieka sobie na ekran
2. Brak hermetyzacji pol klasy
3.
  1. <?php
  2. if (!$_SESSION[$nazwa] = $wartosc) {
  3. ?>

WTF? Nie da sie nieprzypisac wartosci do zmiennej, a po drugie
$nazwa = 'cos';
$wartosc = FALSE
(jaka byla kolejnosc operatorow, dodam nawiasy)
if ( ! ( $_SESSION[$nazwa] = $wartosc ) )...
to
! $_SESSION[$nazwa] ma wartosc TRUE czyli warunek jest spelniony i wyrzuci wyjatek
Fipaj
Heh, dzięki.

Mam dość wyjątków, zaczynam stosować die" title="Zobacz w manualu PHP" target="_manual biggrin.gif
dr_bonzo
Nie waz sie!!! Bedzie to beznadziejne wyjscie -- malutki error i aplikacja lezy z messagem: "error -- przyjdz jutro: P ".
Dorwij jakies ksiazki/tutoriale o OOP, moga byc od Javy o wyjatkach + poznaj rozwnice/mozliwosc php w tym obszarze z manuala.
Imperior
set_exception_handler() przechwytuje nieprzechwycone wyjątki
M4chu
A moze lap wyjatki na poziomie kontrolera czy glownego skryptu.
  1. <?php
  2.  
  3. try
  4. {
  5. // aplikacja
  6. }
  7. catch( AppException $e )
  8. {
  9. }
  10. catch( Exception $e )
  11. {
  12. }
  13.  
  14. ?>

I teraz jak pierwszy catch() nic nie zlapie, to napewno zrobi to drugi - wszystkie wyjatki dziedzicza po Exception.
pozdro.
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.