Когда использовать утверждение и когда использовать исключение
Большую часть времени я буду использовать исключение, чтобы проверить условие в моем коде, интересно, когда подходящее время для использования утверждения?
Например,
Group group=null; try{ group = service().getGroup("abc"); }catch(Exception e){ //I dont log error because I know whenever error occur mean group not found } if(group !=null) { //do something }
Не могли бы вы указать, как здесь подходит утверждение? Должен ли я использовать утверждение?
- «CompanyName.Foo» - это «пространство имен», но используется как «тип»,
- Как я могу тестировать графический интерфейс?
- Форматирование ReSharper: выравнивание равных операндов
- Может ли class Java добавлять метод вовремя?
- Проверка указателя NULL в C / C ++
Похоже, я никогда не употребляю утверждений в производственном коде и вижу только утверждения в модульных тестах. Я знаю, что в большинстве случаев я могу просто использовать исключение для проверки, как указано выше, но я хочу знать, как это сделать «профессионально».
- Файлы заголовков C ++, разделение кода
- Код C ++ в файлах заголовков
- Отключение автоматического форматирования в Visual Studio
- Генерировать различные случайные числа в C #
- Завершение кода PHP NetBeans
- Подписывание ароматов продуктов с gradleиентом
- Когда можно использовать обработку исключений для бизнес-логики?
- Как определить неиспользуемые определения css
Утверждения должны использоваться для проверки того, что никогда не должно происходить, в то время как исключение должно использоваться для проверки того, что может произойти.
Например, функция может делиться на 0, поэтому следует использовать исключение, но может быть использовано утверждение, чтобы проверить, что жесткий диск внезапно исчезает.
Утверждение остановит запуск программы, но исключение позволит продолжить работу программы.
Обратите внимание, что if(group != null)
не является утверждением, это просто условно.
Из моего разума (список может быть неполным и слишком длинным, чтобы вписаться в комментарий), я бы сказал:
- использовать исключения при проверке параметров, переданных общедоступным или защищенным методам и конструкторам
- использовать исключения при взаимодействии с пользователем или когда вы ожидаете восстановления кода клиента из исключительной ситуации
- используйте исключения для решения проблем, которые могут возникнуть
- использовать утверждения при проверке предварительных условий, пост-условий и инвариантов частного / внутреннего кода
- использовать утверждения для предоставления обратной связи себе или вашей команде разработчиков
- используйте утверждения при проверке на предмет того, что очень маловероятно, иначе это означает, что в вашей заявке есть серьезная проблема
- используйте утверждения, чтобы утверждать вещи, которые вы (предположительно) знаете, чтобы быть правдой
Другими словами, исключения определяют надежность вашего приложения, в то время как утверждения определяют его правильность.
Утверждения предназначены для того, чтобы быть дешевыми для написания, вы можете использовать их почти повсюду, и я использую это правило: чем больше утверждение утверждения выглядит глупо, тем более ценным оно является и тем больше информации, которую он вкладывает. При отладке программы, которая не ведет себя правильно, вы наверняка проверите более очевидные возможности сбоя на основе вашего опыта. Затем вы будете проверять проблемы, которые просто не могут произойти: это точно, когда утверждения помогают и экономят время.
Помните, что утверждения могут быть отключены во время выполнения с использованием параметров и по умолчанию отключены , поэтому не рассчитывайте на них, кроме как для целей отладки.
Также вы должны прочитать статью Oracle об утверждении, чтобы увидеть больше случаев использования – или не использовать – assert.
Как общее правило:
- Используйте утверждения для внутренних проверок согласованности, где это не имеет значения, если кто-то отключит их. (Обратите внимание, что команда
java
отключает все утверждения по умолчанию.) - Используйте регулярные тесты для любых проверок, которые не следует отключать. Это включает защитные проверки, которые защищают от возможного ущерба, вызванного ошибками, и любые данные / запросы валидации / независимо от того, что предоставляется пользователями или внешними службами.
Следующий код из вашего вопроса – плохой стиль и потенциально глючный
try { group = service().getGroup("abc"); } catch (Exception e) { //i dont log error because i know whenever error occur mean group not found }
Проблема в том, что вы НЕ знаете, что исключение означает, что группа не найдена. Также возможно, что вызов service()
выкинул исключение или вернул null
а затем вызвал исключение NullPointerException
.
Когда вы поймаете «ожидаемое» исключение, вы должны поймать только исключение, которое вы ожидаете. Улавливая java.lang.Exception
(и особенно не регистрируя его), вы затрудняете диагностику / отладку проблемы и потенциально позволяете приложению наносить больше урона.
Согласно этому документу http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#design-faq-general , «Утверждение assert подходит для непубличных предварительных условий, постусловий и инвариантов classов Проверка на уровне публичных предварительных условий все равно должна выполняться проверками внутри методов, которые приводят к определенным, задокументированным исключениям, таким как IllegalArgumentException и IllegalStateException. ”
Если вы хотите узнать больше о предварительном условии, постусловии и инварианте classа, проверьте этот документ: http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#usage-conditions . Он также содержит примеры использования утверждений.
Ну, еще в Microsoft, рекомендация заключалась в том, чтобы выкидывать исключения во всех API, которые вы публикуете публично, и использовать Asserts во всех возможных предположениях, которые вы делаете о внутреннем коде. Это немного неопределенное определение, но я думаю, что каждый разработчик должен рисовать линию.
Что касается использования исключений, как следует из названия, их использование должно быть исключительным, поэтому для кода, представленного выше, вызов getGroup
должен возвращать null
если служба не существует. Исключение должно происходить только в том случае, если сетевая связь снижается или что-то в этом роде.
Я предполагаю, что вывод состоит в том, что для каждого приложения немного осталось до команды разработчиков для определения границ утверждений и исключений.
Тестирование для null приведет к улову null, вызывающему проблемы, тогда как try / catch, поскольку у вас есть, будет ловить любую ошибку.
В общем, try / catch более безопасен, но немного медленнее, и вы должны быть осторожны, чтобы уловить все возможные ошибки. Поэтому я бы сказал, использовать try / catch – в один прекрасный день код getGroup может измениться, и вам может понадобиться эта большая сеть.
Вы можете использовать это простое различие во время их использования. Исключения будут использоваться для проверки ожидаемых и непредвиденных ошибок, которые называются проверенной и непроверенной ошибкой, в то время как утверждение используется в основном для целей отладки во время выполнения, чтобы проверить, подтверждены ли допущения или нет.
Признаюсь, я немного смущен вашим вопросом. Когда условие утверждения не выполняется, генерируется исключение. Смутно это называется AssertionError . Обратите внимание, что он не установлен, например (например) IllegalArgumentException, которое вызывается в очень похожих обстоятельствах.
Поэтому использование утверждений в Java
- является более сжатым средством записи блока состояния / броска
- позволяет вам включать / выключать эти проверки с помощью параметров JVM. Обычно я оставлял эти проверки постоянно, если только они не влияют на производительность во время выполнения или имеют аналогичный штраф.
См. Раздел 6.1.2 (Утверждения против другого кода ошибки) документации Sun по следующей ссылке.
http://www.oracle.com/technetwork/articles/javase/javapch06.pdf
Этот документ дает лучший совет, который я видел, когда использовать утверждения. Цитата из документа:
«Хорошим правилом является то, что вы должны использовать утверждение для исключительных случаев, о котором вы хотели бы забыть. Утверждение – это самый быстрый способ справиться с состоянием или состоянием, которое вы не ожидаете, иметь дело с.”
К сожалению, утверждения могут быть отключены. Когда в производстве вам нужна вся помощь, которую вы можете получить при отслеживании чего-то непредвиденного, так утверждает, что дисквалифицирует себя.