Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obsługa wyjątków
Forum PHP.pl > Forum > PHP
Jarod
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?
dr_bonzo
A czemu musza byc jednej klasy?
q
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. ?>
envp
Przecież wyjątek to nienormalne zadziałanie aplikacji i chyba gdy złapiemy Exception to skrypt bezwarunkowo kończy pracę.
Jarod
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();
ikioloak
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
envp
nyss ? smile.gif
Jarod
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
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.