Суфікс Виняток щодо винятків у Java


19

Якщо вказати суфікс винятку для класів виключень, мені здається, що кодовий запах (надлишня інформація - решта імені передбачає стан помилки, і він успадковується від винятку). Однак також здається, що всі це роблять, і це здається гарною практикою.

Я хочу зрозуміти, чому це хороша практика.

Я вже бачив і читав питання, чому винятки, як правило, мають назву суфікса у назві класу

Питання стосується PHP, і хоча відповіді, ймовірно, дійсні для Java. Чи є якісь інші аргументи чи це насправді так просто, як явно їх диференціювати?

Якщо взяти приклади з попереднього питання - чи дійсно могли бути заняття в java з ім'ям, FileNoFoundяке не є винятком? Якщо це може бути, чи гарантує суфікс це Exception?

Дивлячись на швидку ієрархію в затемненні Exception, напевно, переважна більшість з них має суфікс винятку, але є кілька винятків. javassistє прикладом бібліотеки, яка, здається, має кілька винятків без суфікса - наприклад BadByteCode, BadHttpRequestтощо.

BouncyCastle це ще одна ліб з винятками на кшталт CompileError

Я трохи погуглився і трохи інформації з цього питання.


2
"Чи всі винятки мають Exceptionсуфікс, або ми повинні робити винятки для виняткових винятків?" ;)
tdammers

2
насправді Помилка схожа на Виняток (див. OutOfMemoryError), але вони призначені для речей, з яких важко відновитись (тому ви майже ніколи з ними не справляєтесь)
щурячий вирод

1
Крім того, я чув, що як правило, "класи повинні бути іменниками, а методи - дієсловами (діями)". FileNotFound ArrayIndexOutOfBoundsі OutOfMemoryбільше спостережень / описів, але потім застосовуються до іменника Exception.
MikeTheLiar

Відповіді:


27

Відповідь Ландея хороша, але є і граматична відповідь. Імена класу повинні бути іменниками . Що таке "OutOfMemory"? Що таке "FileNotFound"? Якщо ви вважаєте "Виняток" як іменник, то дескриптор - це прикметник, що вказує його. Це не просто будь-яке Exception, це FileNotFoundException. Вам не потрібно буде ловити OutOfMemoryбільше, ніж ви йдете в магазин, щоб придбати "блакитний".

Це також з’являється, якщо ви читаєте свій код у вигляді речення: " Tryроби ... і catch OutOfMemory Exceptions"


1
Цитувати статтю "Спробуйте використовувати іменники, тому що клас звичайно репрезентує щось у реальному світі". Але чи потрапляють до цього випадку винятки? Для мене вони більше схожі на артефакт програмування, представляючи повідомлення про помилку. "Ви отримаєте OutOfMemoryвиняток" читається краще, ніж "Ви отримаєте OutOfMemoryExceptionвиняток", чи не так?
greg0ire

1
@ greg0ire - Спробуйте спробувати "Ви отримаєте" OutOfMemoryException. Однак, у нас також є PIN-коди та банкомати, тому виняток OOME не буде таким незвичним.
Бобсон

Думаю, що ви тут дотримуєтесь справді найкращого (той, що стосується конфліктів імен, вже не тримається завдяки просторам імен, принаймні у php). Я маю більше сказати про все це, і скоро опублікую відповідь.
greg0ire

Готово! Що ти думаєш?
greg0ire

@Bobson рекомендую прочитати Королівство іменників . Нам не потрібно, щоб все було іменником. Чому «ви отримуєте OutOfMemoryException» , коли це може бути просто «ви перебуваєте з пам'яті»? Ми не використовуємо Classсуфікси ( DogClass, CatClass, XmlReaderClass...).
Матьє Наполі

6

Я думаю, що винятки (і помилки, і теоретично інші Throwable) відрізняються від речей, таких як інтерфейси або перерахунки (які зазвичай не використовуються як суфікс): вони мають звичайно чітке і обмежене призначення, вони використовуються зі спеціалізованими мовними конструкціями ( try, catch, throw, throws) і слідувати спеціальним правилам (наприклад , перевірив проти неконтрольованих винятків, що дженерики). Певним чином, це не просто класи, які, як правило, використовуються як винятки, а механізм винятку, який реалізується засобами класів.

Тож якщо ви маєте справу з винятком і не визнаєте його як такого, зазвичай щось глибоко неправильно (що знову не стосується таких речей, як перерахунки чи інтерфейси). Тому я думаю, що ці відмінності від «нормальних» класів досить великі, щоб вимагати візуального підказки.


1
Звучить мені суперечливо. Якщо винятки є такими особливими і використовуються спеціальними способами і так очевидно впізнавані, для чого вам потрібна візуальна підказка?
Майкл Боргвардт

@MichaelBorgwardt - Я думаю, що він говорить, що оскільки вони особливі і використовуються спеціальними способами, вони повинні мати наочний розгадку, щоб бути явно впізнаваним. Це , так би мовити, я не знаю , навіть якби ви були можете кинути що - то , що ні успадкований від Exceptionв Java - ви не можете в C #. Якщо ви не можете, то я не можу придумати сценарій, коли ви б "мали справу з винятком і [не] визнавали його як такого".
Бобсон

Ви також не можете кидати non- Throwableфайли в Java. Однак ви можете мати справу з виключенням не тільки try- catch-Settings, наприклад , ви можете збирати виключення , коли ви робите якісь - то перевірки для складних об'єктів (якщо ви хочете знати , все пов'язані з цим проблеми, а не тільки перший). У таких випадках ви повинні знати, що ви можете, наприклад, перекинути речі, які у вас є у своєму списку, тому було б погано називати їх, тобто ValidationIssueзамість них ValidationException.
Ландей

0

Однак також здається, що всі це роблять, і це здається гарною практикою.

Так, це дійсно всі роблять, тому це практика, але чи все-таки це добре? Кілька людей ставлять питання:

  • http://mnapoli.fr/approaching-coding-style-rationally/ (Суфікс винятку § контекст: php)
  • пов’язане відео https://vimeo.com/album/2661665/video/74316116 (пропустити до 53:00, контекст: php), надихає статтю і зазначає, що кожного разу, коли ви використовуєте виняток, у вас є ключове слово що вже показує, що це виняток поблизу
  • http://verraes.net/2013/10/verbs-in-class-names/ показує, як твердження у відповіді @Bobson може бути не абсолютним, і вказує на те, що іноді суфікс хороший, для застосування або винятки на рівні інфраструктури, і іноді вам слід спробувати зберегти символи, взяті цим довгим суфіксом, щоб висловити щось більш точне та значуще. Цей пункт має сенс лише в тому випадку, якщо ви використовуєте мову, де культура повинна використовувати винятки за порушення правил бізнесу.
  • SO посилання ви забезпечуєте роблять пункти про конфлікт імен, але тепер у нас є простір імен, чи не так?

Це питання Java , а не php . Ідіоми відрізняються між мовами. З цього приводу я категорично не згоден з цією цитатою з вашого третього посилання: "Винятки можуть бути схожими на події, ... з нюансом того, що це небажана подія, попередження про те, що деяка операція не відповідала, наприклад, правилам бізнесу, які діють ». Можливо, PHP з цього приводу відрізняється, але, на мій погляд, винятки повинні бути винятковими. Якщо ділове правило порушено будь-яким очікуваним способом, ваша нормальна логіка повинна впоратися з цим - це не виняток із звичайної поведінки.
Бобсон

Ви можете мати рацію в тому, що вона змінюється залежно від мови: перегляньте цю тему про python: gossamer-threads.com/lists/python/python/796627 . php та python очевидно не орієнтовані на ефективність, тому, можливо, чому існує така різниця у Java (яка орієнтована на ефективність, правда?). Якщо у вашому стеку викликів потрібно перетнути кілька шарів, перш ніж бути на правильному рівні, щоб правильно обробити правила ділових правил, винятки - найкращі ІМО. Це також робить типи повернення більш послідовними (ви повертаєте завжди один і той же тип, а не помилковий або правдивий). Я відредагую свою відповідь на це
greg0ire
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.