Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF]Custom Exception Listener - kiedy stosować?
Forum PHP.pl > Forum > PHP > Frameworki
porzeczki
Custom Exception Listener:
- zamiast łapać wyjątek z komunikatem błędu, robię listener eventu KernelEvents::EXCEPTION, gdzie mam dostęp do obiektu wyjątku.
- i w listenerze tworzę response (lub wywołuję kontroler)
- tak to robi np TwigBundle, czyli listener wywołoje kontroler, który renderuje twig z errorem.

Tylko teraz się zastanawiam czy mam każdy wyjątek w tej sposób obsługiwać.
Kiedy catch a kiedy listener?
lukaskolista
Try/catch używasz wtedy, kiedy chcesz wyłapać wyjątek i go jakoś obsłużyć. Są wyjątki przez które nie trzeba wyświetlać strony błędu, bo można np. pójść alternatywną ścieżką lub ponowić próbę. Listner służy raczej do łapania niewyłapanych wyjątków, które obsługuje się w jednolity sposób jak strona błędów.

Generalnie każde niepowodzenie powinno spowodować rzucenie wyjątku, a nawet w prostych aplikacjach jest dużo rzeczy, które pójdą nie tak i teraz to Twoja decyzja, co chcesz z nimi zrobić.
porzeczki
bo czytam o exceptions tu i tam i często mowa jest o tym że:
  • - "Wielopoziomowe" try catch usprawnia pracę, np. łapiesz wyjątek, w catchu wykonujesz jakąś akcję (ustawiesz pole Status w encji na "ERROR") i sypiesz wyjątkiem wyżej, funkcja wyżej wykonuje kolejną akcję jak np logowanie błędu etc.
  • - wyjątki wyrzucać do możliwie najbliższego poziomu wyżej, nie rozgłaszam całemu światu że jest problem - jeśli mogę naprawić problem robię to możliwie najszybciej.
  • -Extending Exceptions for Abstraction
    - każda warstwa powinna mieć swój własny typ wyjątku
    - czyli wyjątek w warstwie Model winien być schwytany w kontrolerze
    -.. i naparwiony lub owinięty i puszczony dalej jako wyj. kontrolera
    - albo jeśli biblioteka Twitter wyrzuci wyjątek
    -.. to klasa jej używająca owija go i wyrzuca nowy.
    - dzięki temu wiem gdzie wyjątek powstał i zachowana jest abstrakcja!
    - Wykorzystuje się tu metodę Exception::getPrevious()
  • - owijanie exceptions ::getPrevious() i re-thrown
    - używam jakiegoś 3rd part library, który wyrzuca jakieś wyjątki
    - te wyjątki bąbelkują i stają się częścią mojego API
    - używam annotations @throws w własnych metodach z klasami wyjątków
    - i problem jest gdy wyjątki 3rdPL zmieniają nazwy lub dodają nowe
    - i muszę zmieniać annotations @throws w własnych metodach
    - [!]ZATEM jeśli moje API nie może poradzić sobie z wyjątkiem 3rdPL:
    - to powinno owinąć i wyrzucić nowy jako wyjątek nowego poziomu
    - Dzięki temu nie jestem uzależniony od zmian w 3rdPL (wz. adapter)


a w Symfony jeb, i od razu jestem na strychu przez kernel::handle w listenerze. Nie powiem, ta opcja bardziej mi pasuje, jest wygodniejsza. Na mój rozum nie ma róznicy kiedy wyjątek jest łapany, Czy złapię go na 2 piętrze czy na strychu, przecież i tak żaden kod nie jest robiony póki nie zostanie złapany wyjątek. A w listenerze wyjątku mogę znowu puścić kod od parteru. (zastrzegam, że mam prawie zerowe doświadczenie w używaniu wyjątków.)
nospor
Juz raz walkowales ten temat tutaj
http://forum.php.pl/index.php?showtopic=25...p;#entry1207487
i Crozin raczej udzielil ci wyczerpujacej odpowiedzi.
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.