Jeśli przy próbie pobrania czegoś leci wyjątek, to problemem jest brak tego czegoś i to ten problem należy rozwiązać, czyli najpierw ->hasItem($id) a potem ->getItem($id) zamiast try+catch
Cytat
Try/catch (po przezywyczajeniu) wydaje mi się bardziej czytelny, jeśli oczywiście stosujemy szczegółowe wyjątki a nie \Exception
Kiedyś widziałem taki kod:
if($isLogged){
throw new isLoggedException();
}else{
throw new isNotLoggedException();
}
A potem try + catch jak trzeba wyświetlić formularz logowania, od wuja "instance of"
Używanie wyjątków do implementacji logiki nie jest w niczym lepsze od używania goto. Potem masz pincet wyjątków, jeden jest tłumaczony na inny, łapane są w każdych możliwych miejscach, tworzy się pajęczyna zależności i zamiast aplikacji jest burdel.
Cytat
Ja bym jednak wolał aby repozytoria zwracały puste tablice/kolekcje oraz null
- jeśli obsługa czegoś nie jest jednoznaczna (np. Athabus chce okodować sytuację, kiedy host nie odpowiada, natomiast Markonix woli mieć w takiej sytuacji exception i stronę błędu) to wiele bibliotek daje możliwość konfiguracji:
http://docs.guzzlephp.org/en/stable/reques...tml#http-errorsI powiem znowu: wg mnie wyjątki są po to, aby czegoś nie obsługiwać a nie odwrotnie, jeśli leci wyjątek a mimo to go łapiemy bo chcemy, żeby aplikacja działała dalej to oznacza to, że jest to workaround bo albo czegoś nie przewidzieliśmy (np. tego, że brak połączenia z jakimś API nie musi wywalać aplikacji) albo nie zaimplementowaliśmy (np. w podanym przykładzie próbujemy coś pobrać bez wcześniejszego sprawdzenia, czy to coś istnieje).
Cytat
Które podejście stosujecie? Dlaczego.
Zdroworozsądkowe, generalnie nie przesadzać z rzucaniem wyjątku, jak najczęściej dawać wybór, nawet w sposób dynamiczny, np. jeśli mamy obiekt ACL i metodę ->hasRole, to możemy przekazać parametr czy chcemy boolean'a czy exception. Jak sprawdzamy w kontrolerze to lepszy jest exception, jak w templacie to boolean
Znajdziemy też pewnie sporo takich przykładów w samym PHP:
http://php.net/manual/pl/pdo.error-handling.php