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, FileNoFound
która nie jest wyjątkiem? Jeśli istnieje, czy uzasadnia to jego dodanie Exception
?
Patrząc na szybką hierarchię w zaćmieniu, z Exception
pewnością ogromna większość z nich ma sufiks wyjątku, ale jest kilka wyjątków. javassist
jest przykładem biblioteki, który wydaje się mieć kilka wyjątków bez przyrostka - na przykład BadByteCode
, BadHttpRequest
itd.
BouncyCastle
to kolejna lib z wyjątkami takimi jak CompileError
Przeszukałem też trochę z niewielkimi informacjami na ten temat.
źródło
Exception
opatrzone przyrostkiem, czy też powinniśmy robić wyjątki od wyjątków?” ;)FileNotFound
ArrayIndexOutOfBounds
iOutOfMemory
są więcej obserwacji / opisów, ale są następnie stosowane do rzeczownikaException
.Odpowiedzi:
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
, toFileNotFoundException
. Nie powinieneś więcej łapać,OutOfMemory
niż pójdziesz do sklepu, aby kupić „niebieski”.Pojawia się to również, gdy czytasz kod jako zdanie: „
Try
robię ...catch OutOfMemory Exceptions
” i „źródło
OutOfMemory
wyjątek” brzmi lepiej niż „OtrzymaszOutOfMemoryException
wyjątek”, prawda?OutOfMemoryException
”. To powiedziawszy, mamy również numery PIN i bankomaty, więc wyjątek OOME nie byłby tak niezwykły.OutOfMemoryException
”, kiedy może to być po prostu „ty jesteś z pamięci”? Nie używamyClass
przyrostków (DogClass
,CatClass
,XmlReaderClass
, ...).Myślę, że wyjątki (i błędy oraz teoretycznie inne
Throwable
s) 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.
źródło
Exception
Java - 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”.Throwable
Java w Javie. Jednakże można sobie z wyjątkiem nie tylkotry
-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.ValidationIssue
ZamiastValidationException
.Tak, wszyscy to robią, więc jest to praktyka, ale czy nadal jest dobra? Kilka osób kwestionuje to:
źródło