Sufiks Wyjątek od wyjątków w Javie

19

Określenie sufiksu wyjątku w klasach wyjątków wydaje mi się zapachem kodu (informacja redundantna - reszta nazwy oznacza stan błędu i dziedziczy po wyjątku). Wydaje się jednak, że wszyscy to robią i wydaje się to dobrą praktyką.

Chcę zrozumieć, dlaczego jest to dobra praktyka.

Widziałem już i czytałem pytanie, dlaczego wyjątki mają zazwyczaj sufiks wyjątek w nazwie klasy

Pytanie dotyczy PHP i chociaż odpowiedzi są prawdopodobnie poprawne dla Javy. Czy są jakieś inne argumenty, czy naprawdę jest tak proste, jak ich wyraźne różnicowanie?

Jeśli weźmiemy przykłady z poprzedniego pytania - czy naprawdę mogą istnieć klasy w java o nazwie, FileNoFoundktóra nie jest wyjątkiem? Jeśli istnieje, czy uzasadnia to jego dodanie Exception?

Patrząc na szybką hierarchię w zaćmieniu, z Exceptionpewnością ogromna większość z nich ma sufiks wyjątku, ale jest kilka wyjątków. javassistjest przykładem biblioteki, który wydaje się mieć kilka wyjątków bez przyrostka - na przykład BadByteCode, BadHttpRequestitd.

BouncyCastle to kolejna lib z wyjątkami takimi jak CompileError

Przeszukałem też trochę z niewielkimi informacjami na ten temat.

drone.ah
źródło
2
„Czy wszystkie wyjątki powinny być Exceptionopatrzone przyrostkiem, czy też powinniśmy robić wyjątki od wyjątków?” ;)
tdammers
2
tak naprawdę Błąd jest jak wyjątek (patrz OutOfMemoryError), ale są one przeznaczone do rzeczy, z których trudno jest odzyskać (więc prawie nigdy się nimi nie zajmujesz)
maniak ratchet
1
Słyszałem również, że zgodnie z ogólną zasadą „klasy powinny być rzeczownikami, a metody powinny być czasownikami (działaniami)”. FileNotFound ArrayIndexOutOfBoundsi OutOfMemorysą więcej obserwacji / opisów, ale są następnie stosowane do rzeczownika Exception.
MikeTheLiar

Odpowiedzi:

27

Odpowiedź Landei jest dobra, ale jest też odpowiedź gramatyczna. Nazwy klas powinny być rzeczownikami . Co to jest „OutOfMemory”? Co to jest „FileNotFound”? Jeśli myślisz o „wyjątku” jako rzeczowniku, to deskryptor jest przymiotnikiem, który go określa. To nie tylko każdy Exception, to FileNotFoundException. Nie powinieneś więcej łapać, OutOfMemoryniż pójdziesz do sklepu, aby kupić „niebieski”.

Pojawia się to również, gdy czytasz kod jako zdanie: „ Tryrobię ... catch OutOfMemory Exceptions” i „

Bobson
źródło
1
Cytując artykuł „Spróbuj użyć rzeczowników, ponieważ klasa zwykle reprezentuje coś w prawdziwym świecie”. Ale czy w tej sprawie mieszczą się wyjątki? Dla mnie są bardziej jak artefakt programistyczny, reprezentujący komunikat o błędzie. „Otrzymasz OutOfMemorywyjątek” brzmi lepiej niż „Otrzymasz OutOfMemoryExceptionwyjątek”, prawda?
greg0ire,
1
@ greg0ire - Powinieneś spróbować jako „Otrzymasz OutOfMemoryException”. To powiedziawszy, mamy również numery PIN i bankomaty, więc wyjątek OOME nie byłby tak niezwykły.
Bobson,
Myślę, że punkt, który tu poruszasz, jest naprawdę najlepszy (ten dotyczący konfliktów nazw nie ma już miejsca dzięki przestrzeniom nazw, przynajmniej w php). Mam więcej do powiedzenia na ten temat i wkrótce opublikuję odpowiedź.
greg0ire,
Gotowy! Co myślisz?
greg0ire
@ Bobson Polecam lekturę The Kingdom of Nouns . Nie potrzebujemy wszystkiego, aby być rzeczownikiem. Dlaczego „dostaniesz OutOfMemoryException”, kiedy może to być po prostu „ty jesteś z pamięci”? Nie używamy Classprzyrostków ( DogClass, CatClass, XmlReaderClass, ...).
Matthieu Napoli
6

Myślę, że wyjątki (i błędy oraz teoretycznie inne Throwables) różnią się od rzeczy takich jak interfejsy lub wyliczenia (które zwykle nie są używane jako sufiks): mają zwykle bardzo jasny i ograniczony cel, są używane ze specjalistycznymi konstrukcjami językowymi ( try, catch, throw, throws) i wykonaj specjalne zasady (np sprawdzone vs niekontrolowanych wyjątkami, nie rodzajowych). W pewnym sensie nie są to tylko klasy, które są wykorzystywane jako wyjątki, ale mechanizm wyjątków, który jest implementowany za pomocą klas.

Jeśli więc masz do czynienia z wyjątkiem i nie rozpoznajesz go jako takiego, zwykle coś jest głęboko nie tak (co znowu nie jest tak w przypadku wyliczeń lub interfejsów). Myślę więc, że te różnice w stosunku do „normalnych” klas są wystarczająco duże, aby wymagać wizualnej wskazówki.

Landei
źródło
1
Brzmi dla mnie wewnętrznie sprzecznie. Jeśli wyjątki są wyjątkowe i stosowane w specjalny sposób i tak wyraźnie rozpoznawalne, dlaczego potrzebujesz wizualnej wskazówki?
Michael Borgwardt
@MichaelBorgwardt - Myślę, że mówi, że ponieważ są wyjątkowe i używane w specjalny sposób, powinny mieć wizualną wskazówkę, aby były oczywiście rozpoznawalne. Mając na uwadze powyższe, nie wiem, czy nawet może wyrzucić coś, co nie jest dziedziczona z ExceptionJava - nie można w języku C #. Jeśli nie możesz, to nie mogę wymyślić scenariusza, w którym „miałbyś do czynienia z wyjątkiem i [nie] rozpoznałby go jako takiego”.
Bobson
Nie możesz także wrzucać nie- ThrowableJava w Javie. Jednakże można sobie z wyjątkiem nie tylko try- catch-Settings, np można zbierać wyjątki podczas wykonywania jakiegoś walidacji dla złożonych obiektów (jeśli chcesz wiedzieć, wszystkie związane z tym problemy, nie tylko pierwszy). W takich przypadkach powinieneś zdawać sobie sprawę, że możesz np. Ponownie rzucić rzeczy, które masz na liście, więc źle byłoby nazywać je np. ValidationIssueZamiast ValidationException.
Landei
0

Wydaje się jednak, że wszyscy to robią i wydaje się to dobrą praktyką.

Tak, wszyscy to robią, więc jest to praktyka, ale czy nadal jest dobra? Kilka osób kwestionuje to:

  • http://mnapoli.fr/approaching-coding-style-rationally/ (Sufiks wyjątku § kontekst: php)
  • połączone wideo, https://vimeo.com/album/2661665/video/74316116 (przejdź do 53:00, kontekst: php), inspiruje artykuł i podkreśla, że ​​za każdym razem, gdy używasz wyjątku, masz słowo kluczowe co już pokazuje, że jest to wyjątek w pobliżu
  • http://verraes.net/2013/10/verbs-in-class-names/ pokazuje, w jaki sposób stwierdzenie w odpowiedzi @ Bobson może nie być absolutne, i wskazuje, że czasami sufiks jest dobry, do zastosowania lub wyjątki na poziomie infrastruktury, a czasem powinieneś próbować zapisać znaki wzięte z tego długiego sufiksu, aby wyrazić coś bardziej precyzyjnego i sensownego. Ten punkt ma sens tylko wtedy, gdy używasz języka, w którym kultura ma stosować wyjątki w przypadku naruszenia reguł biznesowych.
  • SO pomocą łącza podać punktów sprawia, że temat konfliktów nazw, ale teraz mamy nazw, prawda?
greg0ire
źródło
To jest pytanie Java , a nie php . Idiomy różnią się między językami. Powiedziawszy to, zdecydowanie nie zgadzam się z cytatem z twojego trzeciego linku: „Wyjątki mogą być podobne do zdarzeń,… z tym, że jest to niepożądane zdarzenie, ostrzeżenie, że niektóre operacje były niezgodne, na przykład z regułami biznesowymi, które obowiązują ”. Może PHP różni się w tej kwestii, ale moim zdaniem wyjątki mają być wyjątkowe. Jeśli reguła biznesowa zostanie naruszona w jakikolwiek oczekiwany sposób, normalna logika powinna ją obsłużyć - nie jest to wyjątek od normalnego zachowania.
Bobson,
Być może masz rację, ponieważ różni się w zależności od języka: zobacz ten wątek o python: gossamer-threads.com/lists/python/python/796627 . php i python najwyraźniej nie koncentrują się na wydajności, może dlatego jest taka różnica w java (która jest skoncentrowana na wydajności, prawda?). Jeśli masz kilka warstw do przekroczenia w stosie połączeń, zanim znajdziesz się na odpowiednim poziomie, aby poprawnie obsłużyć naruszenie reguł biznesowych, wyjątki są najlepsze IMO. Sprawia również, że typy zwrotów są bardziej spójne (zwracany jest zawsze ten sam typ, nie fałsz lub prawda).
Zmienię