Задание суффикса Exception для классов исключений выглядит для меня как запах кода (избыточная информация - остальная часть имени подразумевает состояние ошибки и наследуется от Exception). Однако, кажется, что все так делают, и это хорошая практика.
Я хочу понять, почему это хорошая практика.
Я уже видел и читал вопрос, почему у исключений обычно есть исключение суффикса в имени класса
Вопрос касается PHP и, хотя ответы, вероятно, действительны для Java. Существуют ли другие аргументы или это действительно так просто, как явно их дифференцировать?
Если мы возьмем примеры из предыдущего вопроса - действительно ли могут быть классы в Java с именем FileNoFound
, которое не является исключением? Если это возможно, то оправдывает ли это суффикс Exception
?
Если взглянуть на быструю иерархию в затмении, то Exception
, конечно же, подавляющее большинство из них имеют суффикс исключения, но есть несколько исключений. javassist
пример библиотеки, которая, кажется, имеет несколько исключений без суффикса - например BadByteCode
, BadHttpRequest
и т. д.
BouncyCastle
это еще одна библиотека с исключениями, такими как CompileError
Я также немного погуглил с небольшой информацией по этому вопросу.
источник
Exception
суффикс, или мы должны делать исключения для исключительных исключений?» ;)FileNotFound
ArrayIndexOutOfBounds
иOutOfMemory
больше наблюдений / описаний, но затем применяются к существительномуException
.Ответы:
Ответ Ландеи хороший, но есть и грамматический ответ. Имена классов должны быть существительными . Что такое "OutOfMemory"? Что такое "FileNotFound"? Если вы думаете об «Исключении» как существительном, тогда дескриптор - это прилагательное, определяющее его. Это не просто любой
Exception
, этоFileNotFoundException
. Вам не нужно ловитьOutOfMemory
больше, чем идти в магазин, чтобы купить «синий».Это также проявляется, если вы читаете ваш код в виде предложения: "
Try
делаю ... иcatch OutOfMemory Exceptions
"источник
OutOfMemory
исключение» читается лучше, чем «Вы получитеOutOfMemoryException
исключение», не так ли?OutOfMemoryException
." Тем не менее, у нас также есть номера PIN и банкоматы, поэтому исключение OOME не было бы , что необычно.OutOfMemoryException
» , когда это может быть просто «вы находитесь из памяти»? Мы не используемClass
суффиксы (DogClass
,CatClass
,XmlReaderClass
...).Я думаю, что исключения (и ошибки, и теоретически другие
Throwable
) отличаются от таких вещей, как интерфейсы или перечисления (которые обычно не используются в качестве суффикса): они обычно имеют очень четкое и ограниченное назначение, они используются со специальными языковыми конструкциями (try
,catch
,throw
иthrows
) и следуйте специальным правилам (например, отмеченные и непроверенные исключения, никаких обобщений). В некотором смысле это не просто классы, которые используются в качестве исключений, а механизм исключений, который реализуется с помощью классов.Так что, если вы имеете дело с исключением и не распознаете его как таковое, обычно что-то глубоко неправильно (что опять-таки не так для вещей, таких как перечисления или интерфейсы). Поэтому я думаю, что эти отличия от «обычных» классов достаточно велики, чтобы вызвать визуальную подсказку.
источник
Exception
в Java - вы не можете в C #. Если вы не можете, то я не могу придумать сценарий, в котором вы будете «иметь дело с исключением и [не] распознавать его как таковое».Throwable
в Java, либо. Однако вы можете иметь дело с исключениями не только в параметрахtry
-catch
, например, вы можете собирать исключения, когда выполняете какую-то проверку для сложных объектов (когда вы хотите знать все связанные проблемы, а не только первую). В таких случаях вы должны знать, что вы можете, например, перебрасывать вещи, которые есть в вашем списке, поэтому было бы плохо называть их, т.е.ValidationIssue
вместоValidationException
.Да, все так и делают, так что это практика, но разве это хорошо? Несколько человек спрашивают, что:
источник