Должен ли я бросать NotImplementedException()
на default
, если у меня есть случаи для всех возможных типов перечислений?Throwing NotImplementedException по умолчанию в операторе switch
ответ
Если вы ищете значение, которое должно, по определению, соответствуют значению перечисления, и вы получили что-то еще, это определенно неверный аргумент.
Но теперь вы должны рассмотреть контекст.
Является ли метод конфиденциальным и доступен только членам вашей библиотеки классов или приложений? Если это так, это ошибка кодирования, которая никогда не должна происходить в первую очередь. Утверждение и сбой.
Если, с другой стороны, это общедоступный или защищенный метод, и к ним могут обращаться клиенты, потребляющие вашу библиотеку, вам обязательно нужно бросить с содержательным сообщением (и предпочтительно с известным типом исключения).
Важно помнить, что перечисления не проверяются в Рамках. Я могу указать, что для метода требуется параметр типа Environment.SpecialFolder; но он примет любое значение 32-разрядное целочисленное значение.
Итак, короче говоря, если ваш метод предназначен для общественного потребления, да, безусловно, бросить. Если это не для общественного потребления, Assert.
+1 хорошо сказал. Если неожиданное значение исходит из вашего собственного, Assert и fail. С другой стороны, если это происходит от кого-то другого, использующего ваш код, тогда вы должны выбросить исключение и дать коду вызова возможность восстановления. –
Почему Assert лучше, чем бросать? Возможно, это условие - редкий случай, и разработчик не ударил его, и его поразил только тестер, который использует сборку Release (без компиляции Assert), и ошибка проглатывается. Лучше ли проглотить ошибки, не сработать, но сделать сложную для отладки некорректную вещь, вместо того, чтобы сбой с трассировкой стека? –
Другой вопрос в том, сколько ошибок проверяется на наличие кода, если вы не пишете API для других компаний? Короткий код я считаю более читаемым, чем код, в котором каждый размер метода удваивается из-за проверки ошибок. Не так ли? –
Это действительно зависит от конкретного процесса, но да, это хороший процесс для ответа в случае по умолчанию: если что-то не должно было быть там.
Это звучит как разумный вариант.
Лично я хотел бы создать исключение нового типа (возможно, InvalidEnumException
или дать ему другое имя, которое будет иметь смысл для команды поддержки) и бросить это.
Я лично попытаюсь использовать одно из множества существующих типов исключений. http://blogs.msdn.com/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx – Joe
Согласовано, занижено, потому что я не думаю, что это случай для настраиваемый тип исключения. –
Я бы выбрал ApplicationException
, потому что если ваш код достигнет значения по умолчанию, и вы этого не ожидали, это означает, что что-то в вашем коде не ведет себя так, как вы думали.
Разве не использование ApplicationException нахмурилось? –
Я никогда не слышал, чтобы –
Я бы сказал, по крайней мере, вы должны поставить Debug.Fail()
.
Вы должны выбросить исключение в случае, если метод никоим образом не может продолжаться. Но если вы хотите преобразовать значения enum в представления строк, тогда вы можете просто вернуть некоторую строку предупреждения. Продукт не будет терпеть крах на пользователя из-за очевидной ошибки, вероятно, будет обходной путь, и все будут счастливы.
Возможно, не NotImplementedException, но ArgumentException. Это будет действительно зависеть от того, где вы его используете.
Это действительно зависит от вашего использования. Это будет полезно, если вы выбросите исключение в первые дни интеграции. Пользователи вашей библиотеки могут сразу же узнать об ошибках
Если вы указали исключение, что произойдет? В каком контексте выполняется оператор switch? Должна ли такая ситуация когда-либо возникать? Должно ли это когда-либо происходить во время выполнения производственного кода? Испытывают ли ваши тесты устройства эту ситуацию? Если это так, возможно, утверждение будет лучше.
Вы должны сначала рассмотреть, что это будет означать, если вы получили значение за пределами известных случаев - что представляет собой переменная, включенная? Тогда вы можете просто использовать тип исключения, который соответствует тому, что на самом деле происходит.
Это действительно зависит.
NotImplementedException что-то вроде отметки todo для меня. Это означает, что кто-то придет позже, чтобы закончить код. Однако я не думаю, что это случай дефолта, который не должен произойти.
Когда вы проверяете состояние объекта, вы можете рассмотреть InvalidOperationException. Ваш метод предназначен только для работы с существующими делами.
Когда вы различаете входной параметр ArgumentException, это всегда уместно.
В других случаях я предпочитаю NotSupportedException. Это немного указывает на то, что что-то не так с платформой или версией. И несовместимые версии кода являются истинным корнем проблемы, когда по умолчанию используется случай переключения, которого не должно было случиться.
интересный ответ. Какова ваша мотивация/рассуждение? –
@Tim: Я обновил свой ответ. –
Отличный ответ, спасибо за обновление. Я полностью согласен с вами, как вы его выразили. Это помогло мне понять это прямо в моей голове. –
- 1. Условие в операторе switch
- 2. Петли в операторе Switch
- 3. Почему неправильный «случай» выполняется после «по умолчанию» в операторе switch
- 4. && и || в операторе switch
- 5. regexp в операторе switch
- 6. Поведение fallout в операторе switch
- 7. Нечетное поведение в операторе switch
- 8. Изменение изображения в операторе switch
- 9. Использование setText в операторе switch
- 10. Java - nextLine(); в операторе switch
- 11. Использование UIColor в операторе switch
- 12. Использование struct в операторе switch
- 13. C: выход в операторе switch
- 14. Использование наборов в операторе «switch»
- 15. Использовать флажок в операторе switch
- 16. Конструктор RegExp в операторе switch
- 17. Список переменных в операторе switch
- 18. Const vs. Static в операторе switch
- 19. Javascript игнорируя переменную в операторе switch
- 20. Ошибка цифрового сравнения в операторе switch
- 21. Обновление переменной PHP в операторе switch (простой)
- 22. Выключить forloop, но в операторе switch php
- 23. Switch - по умолчанию не работает в C
- 24. Параметр Функция в операторе switch в C++
- 25. Невозможно использовать перечисление в операторе switch
- 26. Использование значения по умолчанию в операторе switch при переходе на перечисление
- 27. По умолчанию пункт перед тем случае секций в операторе переключателя
- 28. C Ошибка компиляции в операторе switch
- 29. C Операция с указателем в операторе switch
- 30. Недопустимое значение аргумента символа в операторе switch
Я думаю, это будет зависеть от вашего приложения и от того, что произойдет, если вы закончите с значением вне диапазона. – Joe