• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czy takie używanie wyjątków ma sens?

HackNation - ogólnopolski hackathon
0 głosów
389 wizyt
pytanie zadane 3 grudnia 2020 w PHP przez CSSoup Mądrala (6,460 p.)

Mam następujące pytanie: Czy takie użycie wyjątków jest poprawne, chodzi mi bardziej o fakt tego czy jest to zgodne z dobrymi praktykami? W poniższym przykładzie używam ich do walidacji pól formularza, ale wiem też że mógłbym to rozwiązać w inny sposób.

switch (true) {
      case $this->isEmpty([$uid, $pwd]):
        throw new FormException('Pozostawiono puste pola.');
        break;
      case !$this->userExist($uid);
        throw new UserException('Użytkownik nie został znaleziony.');
        break;
      case !$this->checkPwd($uid, $pwd):
        throw new UserException('Podano błędne hasło');
        break;
    }

4 odpowiedzi

+1 głos
odpowiedź 5 grudnia 2020 przez Ehlert Ekspert (215,070 p.)
wybrane 5 grudnia 2020 przez CSSoup
 
Najlepsza

Kilka rzeczy ode mnie. 

Rzucanie wyjątków w switchu nie jest błędem. Break jest tam nie potrzeby. Pomijam również kwestię, że wygląda to nieczytelnie i drabinka ifów załatwiłaby sprawę. 

Kolejny temat to pomysł korzystania z wyjątków. Moim zdaniem problem walidacji wcale nie wymaga rzucania wyjątków w ramach poinformowania czy dane są poprawne. Oczywiście mówię tutaj o kodzie samej walidacji, która jest de facto czymś całkowicie odrębnym od miejsca, w którym z niej korzystamy.

PS. Nazwij proszę tą metodę po prostu checkPassword.

+1 głos
odpowiedź 3 grudnia 2020 przez Wiciorny Ekspert (282,580 p.)
rzucanie wyjątków w switch/case nie jest poprwane, tzn stosować tak możesz ale dobrą praktyką to nie jest, bo switch/case nie służy do obsługi czegoś takiego.
Swoją drogą jak już masz 2 błędy które, wyrzucają tę samą klasę, można by to sformalizować w jedną rzecz zależną od zmiennych
1
komentarz 4 grudnia 2020 przez ScriptyChris Mędrzec (190,190 p.)

rzucanie wyjątków w switch/case nie jest poprwane, tzn stosować tak możesz ale dobrą praktyką to nie jest, bo switch/case nie służy do obsługi czegoś takiego.

Możesz podać źródło, które określa to jako złą praktykę? Pytam z ciekawości, bo switch jest instrukcją sterującą, więc dlaczego by za jej pomocą nie wykryć przypadku do rzucenia wyjątku? 

+1 głos
odpowiedź 4 grudnia 2020 przez Assasz Nałogowiec (30,460 p.)
edycja 4 grudnia 2020 przez Assasz

Według mnie samo użycie switcha jest spoko, jednak miałbym uwagę do klas wyjątków. Mianowicie najlepszą praktyką jest dostarczanie dedykowanego wyjątku dla każdego use case'a, tj.:

throw UserException::notFound();

throw UserException::invalidCredentials();

// lub

throw new UserNotFoundException();

throw new InvalidUserCredentialsException();

W ten sposób nie musisz ustawiać komunikatu, ponieważ każdy wyjątek ma taki komunikat predefiniowany.

Btw po instrukcji throw nie musisz robić break :)

+1 głos
odpowiedź 4 grudnia 2020 przez Benek Szeryf (93,330 p.)
Według mnie powinieneś tutaj użyć walidatora. Rzucanie wyjątkami przerywa działanie programu. To raczej nie jest wskazane w przypadku niepowodzenia logowania. Chyba że zapewniasz obsługę takich zdarzeń. Mimo wszystko to i tak jest zła praktyka i wygląda jak niezły work-around, bo wyjątek oznacza sytuację wyjątkową, w zasadzie niespodziewaną w działaniu programu, a nie w zachowaniu użytkownika. Zwykle programy są bardziej deterministyczne niż zachowanie użytkowników portalu ;)

Podobne pytania

0 głosów
1 odpowiedź 290 wizyt
pytanie zadane 30 kwietnia 2020 w JavaScript przez Greeenone Pasjonat (16,100 p.)
0 głosów
1 odpowiedź 190 wizyt
pytanie zadane 12 lipca 2020 w PHP przez Greeenone Pasjonat (16,100 p.)
0 głosów
1 odpowiedź 1,865 wizyt
pytanie zadane 20 lipca 2018 w PHP przez dobre.rece Nowicjusz (200 p.)

93,626 zapytań

142,551 odpowiedzi

323,049 komentarzy

63,130 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 1452p. - dia-Chann
  2. 1437p. - DziarnowskiJ
  3. 1411p. - Łukasz Piwowar
  4. 1409p. - CC PL
  5. 1388p. - Maurycy W
  6. 1371p. - raydeal
  7. 1369p. - Adrian Wieprzkowicz
  8. 1360p. - Tomasz Bielak
  9. 1335p. - robwarsz
  10. 1296p. - Michal Drewniak
  11. 1269p. - Rafał Trójniak
  12. 1248p. - rafalszastok
  13. 1141p. - ssynowiec
  14. 1116p. - rucin93
  15. 1102p. - Dominik Łempicki (kapitan)
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...