Wątek przeniesiony 2019-10-01 13:05 z przez somekind.

Który wyjątek powinien mieć pierwszeństwo?

Odpowiedz Nowy wątek
2019-09-17 21:52
0

Piszę sobie bibliotekę T-Regx i mam funkcję, która pozwala wyciągnąć n ilość znalezionych grup g.
Jak wywołam metodę group('x'), gdy grupy x nie ma to leci NonexistentGroupException.
Jak wywołam metodę only(-2), to leci \InvalidArgumentException, bo ujemny limit.

Który wyjątek powinien polecieć gdy wywoła się

group('missing')->only(-2);

Ktoś mógłby powiedzieć że wyjątek z group(), bo jest wywołana wcześniej (ale dopiero przy only() leci zawołanie do preg_*)
Ktoś inny powiedziałby że ujemny limit to poważniejszy bug, i on powinien lecieć.

Jak myślicie?


Pozostało 580 znaków

2019-09-17 22:07
1

Moim zdaniem z group() zgodnie z zasadą fail fast.

Pozostało 580 znaków

2019-09-17 22:20
0
lookacode1 napisał(a):

Moim zdaniem z group() zgodnie z zasadą fail fast.

Tylko że group() to taki builder. Wszystkie operacje dzieją się w ostatniej metodzie - only(). "Fail fast" Twoim zdaniem tutaj ciągle się aplikuje?


Pozostało 580 znaków

2019-09-17 22:41
0

Moim zdaniem tak. Chociaż tutaj można poczytać, że obie metody są ok.

Pozostało 580 znaków

2019-09-18 02:07
2

Mam dwa pomysły. Albo wyjątek z grupowania (bo siłą rzeczy musisz najpierw wybrać grupę,a potem wybrać ilość) albo oba w zbiorczym wyjątku jako opis błędu całego wyrażenia. To właściwie powinno się dziać na etapie kompilacji, ale jak rozumiem to PHP, więc nie ma o tym mówy.


Pozostało 580 znaków

2019-09-18 07:26
0
lookacode1 napisał(a):

Moim zdaniem z group() zgodnie z zasadą fail fast.

też podzielam te zdanie. Skoro jesteś w stanie już na samym początku rzucić wyjątkiem bo JUŻ wiesz, że jest coś nie tak, to tak zrób.
Wyobraź sobie, że ktoś robi takie cuś:

$group = $builder->group("lala");
// some code
$group->only(-2);

Pozostało 580 znaków

2019-09-18 11:50
0
no_solution_found napisał(a):
lookacode1 napisał(a):

Moim zdaniem z group() zgodnie z zasadą fail fast.

też podzielam te zdanie. Skoro jesteś w stanie już na samym początku rzucić wyjątkiem bo JUŻ wiesz, że jest coś nie tak, to tak zrób.
Wyobraź sobie, że ktoś robi takie cuś:

$group = $builder->group("lala");
// some code
$group->only(-2);

Noo, nie do końca

$group = $builder->group("zła grupa");  // niepoprawna grupa, ale nie można tego jeszcze ustalić
// some code                            // nie ma wyjątku
$group->only(-2); // tutaj się dzieje cała logika, i tutaj wiadomo że grupa jest zła i że index jest zły. 
                  // Mogę wybrać który wyjątek poleci

Pozostało 580 znaków

2019-09-18 12:13
6

A naprawdę nie możesz rzucać wyjątkiem, który zawiera całą listę błędów?
Bo jeśli jest zgłąszany tylko pierwszy z błędów mimo że można by zgłosić wszystkie to często wygląda to tak:

- Hasło ma ponad 30 dni. Wprowadź nowe hasło.
- (róża)
- Hasło za krótkie.
- (różowa róża)
- Hasło musi zawierać minimum 1 cyfrę.
- (1 różowa róża)
- Hasło nie może zawierać spacji.
- (1różowaróża)
- Hasło musi zawierać co najmniej 10 różnych znaków.
- 1pieprzonaróżowaróża
- Hasło musi zawierać co najmniej jedną WIELKĄ literę.
- 1PIEPRZONAróżowaróża
- Hasło nie może zawierać kolejno następujących po sobie wielkich liter.
- 1Pieprzonaróżowaróża
- Hasło powinno mieć ponad 20 znaków długości.

WsadzęCiwTyłek1PieprzonąRóżowąRóżęJeśliMiNatychmiastNieDaszDostępu!
- Hasło uprzednio używane.

Pozostało 580 znaków

2019-09-18 12:34
0
Kamil Żabiński napisał(a):

A naprawdę nie możesz rzucać wyjątkiem, który zawiera całą listę błędów?
Bo jeśli jest zgłąszany tylko pierwszy z błędów mimo że można by zgłosić wszystkie to często wygląda to tak: ...

Tylko że to nie jest formularz interfejsu użytkownika, tylko biblioteka z interfejsem programistycznym.

Np powinno się móc zrobić tak:

try {
    return group('missing')->only(-2);
} 
catch (NonexistentGroupException $e) {
  // obsłuż grupę
} 
catch (InvalidArgumentException $e) {
 // obsłuż index
}

więc raczej starałbym się unikać takich grupujących wyjątków. Miałbym potem pisać catch (NonexistendAndInvalid), catch (MalformedPatternAndNonesitentAndInvalid)? Ewentualnie catch (GrouppingException) i potem jakoś ifami rozpracować co się stało?


edytowany 2x, ostatnio: TomRiddle, 2019-09-18 12:35

Pozostało 580 znaków

2019-09-23 13:08
0

Możesz zwrócić cały stos wyjątków i jak użytkownik będzie chciał, to może je sobie rozwijać i coś tam z tym robić. exception->getRootCause()->getRootCause()->...
Nie wiem jednak czy w swojej bibliotece będziesz w stanie określić co jest "root cause" wyjątku.

Pozostało 580 znaków

2019-09-23 15:43
0
yarel napisał(a):

Możesz zwrócić cały stos wyjątków i jak użytkownik będzie chciał, to może je sobie rozwijać i coś tam z tym robić. exception->getRootCause()->getRootCause()->...
Nie wiem jednak czy w swojej bibliotece będziesz w stanie określić co jest "root cause" wyjątku.

Np tak?

try {
    return group('missing')->only(-2);
} 
catch (Exception $e) {
    if ($e->getRootCause() instanceof NonexistentGroupException) {
        // obsłuż grupę 
    } 
    else if ($e->getRootCause() instanceof InvalidArgumentException) {
        // obsłuż index
    } 
} 

Moim zdaniem trochę średni pomysł. I potem wyobrażasz sobie testowanie tego w phpunit?

Nie, raczej chce rzucić jeden wyjątek, i po prostu chciałem spytać który powinien polecieć w tej sytuacji?


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 0, botów: 1

Robot: CCBot