Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Obsługa wyjątków
Jarod
post 13.01.2007, 00:07:16
Post #1





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Przykładowo mam taki pliczek:
  1. <?php
  2. try
  3. {
  4. $a = 0;
  5. $b = 1;
  6. $c = 2;
  7.  
  8. if ($a == 0) throw new Exception('Zmienna a musi być większa od zera');
  9. if ($b == 1) throw new Exception('Zmienna b musi być wynosić 0');
  10. if ($c == 2) throw new Exception('Zmienna c musi być większa od 10');
  11. }
  12. catch (Exception $e)
  13. {
  14. echo $e;
  15. }
  16. ?>


Zostanie przechwycony wyjątek i wyświetlony komunikat:
Cytat
Zmienna a musi być większa od zera


Teraz chciałbym zrobić coś takiego, że gdy zostanie przechwycony wyjątek 1 zostanie zapisany do pliku, gdy zostanie przechwycony wyjątek 2 natąpi zatrzymanie skryptu przez die() a gdy zostanie przechwycony wyjątek 3 sterowanie zostanie przekierowanie do pliku index2.php.

Zastanawiam się jak w jednym catch rozpoznawać rodzaje wyjątków tej samej klasy?


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
dr_bonzo
post 13.01.2007, 01:26:26
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


A czemu musza byc jednej klasy?


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
q
post 13.01.2007, 03:48:21
Post #3





Grupa: Zarejestrowani
Postów: 62
Pomógł: 0
Dołączył: 4.04.2003
Skąd: Częstochowa/Wrocław

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


na początku rozszerz sobie klasę Exception na np. klasy ExceptionA, ExceptionB, ExceptionC gdzie w tych klasach zdefiniuj sobie metodę z tym co chcesz zrobić (zapis do pliku, wyjście itp.), a następnie łap odpowiednie typy wyjątków i wykonuj dla nich te właśnie metody.

  1. <?php
  2. try
  3. {
  4. $a = 0;
  5. $b = 1;
  6. $c = 2;
  7.  
  8. if ($a == 0) throw new ExceptionA('Zmienna a musi być większa od zera');
  9. if ($b == 1) throw new ExceptionB('Zmienna b musi być wynosić 0');
  10. if ($c == 2) throw new ExceptionC('Zmienna c musi być większa od 10');
  11. }
  12. catch (ExceptionA $e)
  13. {
  14. $e->twojaakcja();
  15. }
  16. catch (ExceptionB $e)
  17. {
  18. $e->twojaakcja();
  19. }
  20. catch (ExceptionC $e)
  21. {
  22. $e->twojaakcja();
  23. }
  24. catch (Exception $e)
  25. {
  26. echo $e;
  27. }
  28. ?>


Ten post edytował q 13.01.2007, 03:48:52


--------------------
www.iNdS.pl - Najwieksza Amatorska Sieć Komputerowa w Polsce
www.marcinpeciak.eu - under construction
Go to the top of the page
+Quote Post
envp
post 13.01.2007, 10:46:04
Post #4





Grupa: Zarejestrowani
Postów: 359
Pomógł: 1
Dołączył: 16.04.2006
Skąd: Łódź

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


Przecież wyjątek to nienormalne zadziałanie aplikacji i chyba gdy złapiemy Exception to skrypt bezwarunkowo kończy pracę.
Go to the top of the page
+Quote Post
Jarod
post 13.01.2007, 11:29:49
Post #5





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(dr_bonzo @ 13.01.2007, 01:26:26 ) *
A czemu musza byc jednej klasy?



Bo mam np klasę ConfigException i Config. W klasie Config istnieje możliwość powstania błędu krytycznego w 3 metodach. W zależności w której metodzie powstanie błąd krytyczny zostanie zastosowana inna obsługa wyjątku. Ale wszystkie wyjątki należą do ConfigException.

@envp: Mi nie wystarcza wywalenie błędu na ekran i koniec. Po złapaniu wyjątku próbuję zastosować działania prewencyjne a jeśli się nia da to die();


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
ikioloak
post 13.01.2007, 11:45:21
Post #6





Grupa: Zarejestrowani
Postów: 416
Pomógł: 0
Dołączył: 8.01.2004

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


J4r0d obiekt klasy Exception ma rowniez pole code, wiec mozesz rzucac wyjatkami o roznych kodach bledow i na podstawie tych kodow wykonywac odpowiednie operacje.

@envp, wyjatek to nienormalne dzialanie aplikacji, ale wcale nie jest powiedziane ze po wyrzuceniu jego ma sie ona zakonczyc. Nalezy ten blad obsluzyc, zalogowac, ale bardzo czesto aplikacja powinna dzialac dalej. Czesto nie sa to w koncu krytyczne wyjatki.

edit: poprawione, mylicie mi sie smile.gif

Ten post edytował ikioloak 13.01.2007, 12:49:34
Go to the top of the page
+Quote Post
envp
post 13.01.2007, 12:41:45
Post #7





Grupa: Zarejestrowani
Postów: 359
Pomógł: 1
Dołączył: 16.04.2006
Skąd: Łódź

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


nyss ? smile.gif
Go to the top of the page
+Quote Post
Jarod
post 13.01.2007, 14:40:16
Post #8





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(ikioloak @ 13.01.2007, 11:45:21 ) *
J4r0d obiekt klasy Exception ma rowniez pole code, wiec mozesz rzucac wyjatkami o roznych kodach bledow i na podstawie tych kodow wykonywac odpowiednie operacje.

Też nad tym myślałem.. Zastanawiam się jak je podzielić, np. kod wyjątu 0 -> błędy krytyczne i następuje przerwanie aplikacji.. Jaka jest Wasza propozycja? Może już to ktoś kiedyś opracował?

Cytat(ikioloak @ 13.01.2007, 11:45:21 ) *
edit: poprawione, mylicie mi sie smile.gif

Kto? winksmiley.jpg


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
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: 19.07.2025 - 11:01