Подкласс исключений для Bad Object State? - PullRequest
0 голосов
/ 18 декабря 2009

Я умеренный поклонник использования подтипов Exception, чтобы описать проблему, вызвавшую исключение. Например, предположим, что я пишу метод, который не позволяет значениям int больше 100 передаваться в качестве аргументов. Я часто начинаю метод с условием защиты от этого и выбрасываю исключение, если оно происходит. Я, вероятно, выброшу исключение System.Argument (с соответствующим сообщением, внутренним исключением и данными), чтобы указать это.

Прямо сейчас у меня есть класс, который имеет два свойства. Чтобы объект считался «допустимым», ровно одно из этих свойств должно иметь ненулевое значение, а другое - нулевое. У меня случается случай с ошибкой, когда это не так, и я хочу вызвать исключение при обнаружении.

Мой вопрос: какой лучший подкласс исключений использовать в этом случае? Я не вижу (недопустимый) подкласс StateException. ApplicationException - очевидный запасной вариант, но он очень общий, и поэтому я надеюсь на что-то лучшее.

В данный момент меня особенно интересуют подклассы .NET Exception, но, поскольку эта проблема касается нескольких языков, я не считаю обсуждения других языковых решений слишком не по теме. Например: Java имеет IllegalStateException , которая, кажется, прекрасно описывает мои потребности. Я также одобрил аналогичный вопрос для Ruby .

Ответы [ 2 ]

3 голосов
/ 18 декабря 2009

Простой ответ (по теме):

Если мы просто говорим о неправильном использовании API, а дизайн означает, что такие ситуации неизбежны, InvalidOperationException , вероятно, то, что вы ищете. Обычно он используется, когда вызывающая сторона сделала что-то неправильное, например, вызывает определенный метод объекта, когда он не находится в допустимом состоянии для обработки вызова. Например. вызов "pop" в пустом стеке или вызов метода "Send" в сокете, для которого еще не вызван метод "Connect".

Не очень простой ответ (немного не по теме):

Это зависит. Вещи, которые приходят на ум:

  • Ваш класс злоупотребляет звонилки или это прослушивается?
  • Можете ли вы изменить API, чтобы избежать Ситуация целиком?
  • Можете ли вы добавить проверку шаги в другом месте, чтобы обнаружить состояние как оно возникает?

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

Если в классе есть ошибка и случай никогда не случится , то я дважды подумал бы, прежде чем добавить исключение для него. Мне очень нравится ответ Эрика на другой вопрос относительно таких ситуаций.

1 голос
/ 18 декабря 2009

Я думаю, что самое близкое из коробки исключение - InvalidOperationException.

"Исключение, которое выдается, когда вызов метода недопустим для текущего состояния объекта"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...