![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 112 Pomógł: 22 Dołączył: 11.04.2010 Skąd: Tarnów Ostrzeżenie: (0%) ![]() ![]() |
Witajcie!
Przejdę od razu do rzeczy:
Kod zwraca Uncaught Exception. Jest to dla mnie nieoczekiwane zachowanie z kilku powodów: 1. Nie ma przeciwwskazań do wywoływania innych funkcji (również user-defined) z samego callback'a 2. set_exception_handler wywołany z poziomu handler'a zwraca prawidłową nazwę callback'a, co oznaczałoby że ma dostęp do bieżącego stosu handler'ów 3. throw ostatecznie się wykonuje i dopiero domyślny handler kończy działanie 4. użycie restore_exception_handler poza handler'em daje oczekiwany rezultat Nie wiem zatem czy jest to problem języka, mojej interpretacji zachowania tych funkcji, czy rodzaj zabezpieczenia przed pętlą wyjątków. W dodatku myślę, że w przypadku error'ów może dziać się analogicznie. Macie może jakieś sugestie, dlaczego wyjątek nie trafia do poprzedniego handler'a? Jakieś alternatywy dla tej funkcjonalności (poza wywoływaniem unknown na końcu catchable)? A komu to potrzebne? Sam fragment kodu to oczywiście koncepcja. Zamiarem jest, aby każda klasa, w której będzie to potrzebne, posiadała odrębny handler, w którym obsługiwane będą wyjątki związane z tą klasą. Natomiast główny handler aplikacji wyłapywałby wszystkie pozostałe wyjątki, tak aby zakończyć działanie w bardziej wdzięczny sposób, niż robi to domyślny handler. EDIT: Znalazłem jeszcze notatkę sprzed 5 lat. Jak zatem rozwiązujecie obsługę wyjątków i błędów w aplikacji, tak aby handling był rozproszony? Gotta catch 'em all? ![]() Ten post edytował session 17.04.2019, 02:38:07 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 378 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
A czemu nie zrobisz tego po prostu w odpowiednich namespace? jeśli pakiet to Cos, to klasy wyjątków w Cos\Exception. Łapanie wszystkich będzie pewnie i tak na poziomie index.php, a reszta tam gdzie wywołujesz klasę.
-------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 112 Pomógł: 22 Dołączył: 11.04.2010 Skąd: Tarnów Ostrzeżenie: (0%) ![]() ![]() |
Nie bardzo wiem jak można by tutaj wykorzystać namespace'y?
![]()
I wtedy wszystkie wyjątki związane z bazą danych obsługiwane w klasie Database, a wyjątki z klasy User z fallback'iem do Database. Finalnie wszystkie pozostałe wyjątki obsługiwane przez kolejny handler. Teoretycznie myślę, że można by zrobić customowy stos handler'ów, callback'i, metody set i restore i wykorzystać tylko jeden "oryginalny" handler, ale czy nie byłby to pewnego rodzaju overkill? Dziwi mnie, że PHP który na kilku stronach manual'a pokazuje wykorzystanie wielu set i restore w tym przypadku nie działa w oczekiwany sposób. ![]() Ten post edytował session 17.04.2019, 11:23:30 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 378 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
Tak z ciekawości. Jak w tej swojej klasie database obsłużysz np transakcje i rollbacki? W klasie User nie powinieneś tworzyć obiektu Database tylko go wstrzyknąć. Bardziej mi to wygląda na problem z architekturą tej aplikacji.
-------------------- |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 112 Pomógł: 22 Dołączył: 11.04.2010 Skąd: Tarnów Ostrzeżenie: (0%) ![]() ![]() |
Ok, nie najlepszy przykład może, tak na prawdę Database byłaby singleton'em i bardziej statyczna, ale wtedy konstruktor nie miałby sensu, więc trochę dla uproszczenia poszedłem na skróty na potrzeby przykładu
![]() Ten post edytował session 17.04.2019, 12:19:44 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 378 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
https://www.php.net/manual/en/language.errors.php7.php
Możesz wiele wyjątków na raz przez | łapać. Na pewno nie żaden singleton i na pewno nie więcej statyków tylko dependency injection. A czepiam się tego bo wyraźnie to pokazuje że masz problem z architekturą całości i prawidłowym grupowaniem funkcjonalności w zestaw klas. -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 25.06.2025 - 00:38 |