Вопрос

Предположим, у вас есть метод с некоторыми предварительными и последующими условиями.Нормально ли создавать класс исключений для каждого предварительного условия, которое не выполняется?Например:Невыполнение pre1 означает создание экземпляра notPre1Exception.

Это было полезно?

Решение

И да, и нет.

Да, нарушение предварительного условия, безусловно, является подходящим временем для создания исключения.Создание более конкретного исключения упростит перехват этого конкретного исключения.

Нет - Объявление нового класса исключений для каждого предварительного условия в вашей программе / api кажется излишним.В конечном итоге это может привести к сотням или тысячам исключений.Это кажется пустой тратой как умственных, так и вычислительных сил.

Я бы рекомендовал создавать исключения для нарушений предварительных условий.Однако я бы не рекомендовал определять новое исключение для каждого предварительного условия.Вместо этого я бы рекомендовал создать более широкие классы исключений, которые охватывают конкретный Тип о нарушении предварительных условий, а не о конкретном нарушении предварительных условий.(Я бы также рекомендовал использовать существующие исключения там, где они хорошо подходят.)

Другие советы

Почему вы не хотите определять PreconditionFailedException(предварительное условие строки)?Создание другого типа исключения для каждого сбойного предварительного условия является излишеством.

Сбойное предварительное условие должно вызывать исключение AssertException или что-то подобное.Перед вызовом метода необходимо выполнить его предварительное условие.Если вызывающий не выполняет эту проверку, это ошибка в программе или неправильное использование метода (API).

Только в том случае, если не будут выполнены предварительные условия, это будет редким исключительный возникновение.

Для меня это звучит как полезное использование исключений.Это, безусловно, позволяет выполнять более детальное ведение журнала и отладку, чем просто общее "сбой предварительного условия", хотя вы также могли бы создать единственное исключение "сбой предварительных условий" и указать, какие предварительные условия завершились неудачей, в сообщении об исключении.

Я думаю, что это нормально - создавать разные исключения для всех ваших исключений, если вы планируете их использовать и обрабатывать.

Я обнаружил, что чем лучше обработка ошибок / исключений, тем легче отлаживать программное обеспечение на более поздних этапах.

Например:Если у вас есть универсальный excpeiton для обработки всех неверных входных данных, то вы должны просмотреть все, что было передано в метод, если есть ошибка.Если у вас есть список всех типов неблагоприятных условий, вы будете точно знать, где искать.

Мне это кажется возможным, но если вы хотите продолжить этот способ работы с предварительными условиями, в итоге вы получите N классов исключений для каждого метода класса.Похоже на взрывной рост "нефункциональных" классов.

Мне всегда нравился код, в котором "основная" функциональность не обрабатывала нарушение предварительных условий (кроме их утверждения - отличная помощь!).Затем этот код может быть заключен в "средство проверки предварительных условий", которое делает генерирует исключения или иным образом уведомляет о неудовлетворении.

В качестве очень-очень общего способа определить, следует ли вам когда-либо создавать класс или нет (а исключение - это класс), вы должны определить, существует ли какой-либо код, который делает этот класс уникальным среди всех других классов (в данном случае исключений).

Если нет, я бы просто поместил строку в исключение и поставил на этом точку.Если вы выполняете код в своем исключении (возможно, универсальный механизм восстановления, который может обрабатывать несколько ситуаций путем вызова exception.resolve() или чего-то еще), то это может быть полезно.

Я понимаю, что исключения не всегда следуют этому правилу, но я думаю, что это более или менее потому, что исключения, предоставляемые языком, не могут содержать в себе никакой бизнес-логики (потому что они не знают бизнес -библиотеки всегда, как правило, полны исключений из правил OO)

Я думаю, что Бен попал в цель.Какой смысл создавать разные исключения, если вы не собираетесь их перехватывать?Если вы действительно хотите создать другой, я бы, по крайней мере, имел общий базовый класс "PreconditionFailedException", из которого все они являются производными, и попытался организовать их в какую-то иерархию, чтобы вы могли перехватывать их группы.Лично у меня бы не было разных исключений, а просто было бы общее исключение, которое вы выдаете, с подробностями сбоя в каждом из них.

НЕТ, вам не следует создавать конкретное исключение для каждого предварительного условия, поскольку это будет противоречить принципам Проектирования по контракту.

Следствием реализации предварительных условий является то, что они должны быть частью документации и что вы должны предоставить вызывающей стороне необходимые методы для проверки того, что все предварительные условия действительны.(т.е.если выполнение метода зависит от состояния объекта, метод для проверки состояния должен быть доступен вызывающему объекту).

Таким образом, вызывающий должен иметь возможность проверить, выполнены ли все предварительные условия, прежде чем вызывать ваш метод.

Реализация конкретных исключений для каждого нарушенного предварительного условия побудила бы вызывающую сторону использовать шаблон try / catch при вызове метода, что противоречит философии разработки по контракту.

Я бы сказал, что это нормально, пока вы создаете для них непроверенные исключения (подкласс RuntimeException в Java).Однако в Java лучше просто использовать утверждения.

Если вы сделаете это, убедитесь, что все они наследуются от другого распространенного пользовательского исключения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top