В большинстве случаев я буду использовать исключение, чтобы проверить условие в моем коде, мне интересно, когда это подходящее время для использования утверждения?
Например,
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
}
Не могли бы вы указать, как здесь вписывается утверждение? Стоит ли использовать утверждение?
Похоже, я никогда не использую утверждения в производственном коде и вижу только утверждения в модульных тестах. Я знаю, что в большинстве случаев я могу просто использовать исключение для проверки, как указано выше, но я хочу знать, как сделать это «профессионально».
Не в своем уме (список может быть неполным и слишком длинным, чтобы поместиться в комментарии), я бы сказал:
Другими словами, исключения направлены на надежность вашего приложения, а утверждения - на его правильность.
Утверждения разработаны таким образом, чтобы их можно было дешево писать, вы можете использовать их почти везде, и я использую это практическое правило: чем более глупо выглядит утверждение утверждения, тем оно ценнее и тем больше информации в него встроено. При отладке программы, которая ведет себя некорректно, вы обязательно проверите наиболее очевидные возможности отказа на основе вашего опыта. Затем вы проверите, нет ли проблем, которые просто не могут возникнуть: именно тогда утверждения очень помогают и экономят время.
источник
Помните, что утверждения можно отключить во время выполнения с помощью параметров, и они отключены по умолчанию , поэтому не рассчитывайте на них, за исключением целей отладки.
Также вам следует прочитать статью Oracle об assert, чтобы увидеть больше случаев, когда использовать - или не использовать - assert.
источник
Как общее правило:
java
команда по умолчанию отключает все утверждения.)Следующий код из вашего вопроса плохой и потенциально ошибочный
Проблема в том, что вы НЕ ЗНАЕТЕ, что исключение означает, что группа не найдена. Также возможно, что
service()
вызов вызвал исключение или что он вернул,null
что затем вызвалоNullPointerException
.Когда вы перехватываете «ожидаемое» исключение, вы должны перехватывать только то исключение, которое вы ожидаете. Улавливая
java.lang.Exception
(и особенно не регистрируя ее), вы усложняете диагностику / отладку проблемы и потенциально позволяете приложению нанести больший ущерб.источник
Что ж, в Microsoft рекомендовали бросать исключения во все API, которые вы делаете общедоступными, и использовать утверждения во всевозможных предположениях, которые вы делаете о внутреннем коде. Это немного расплывчатое определение, но я думаю, что каждый разработчик должен подвести черту.
Что касается использования исключений, как следует из названия, их использование должно быть исключительным, поэтому для кода, который вы представили выше,
getGroup
вызов должен возвращаться,null
если служба не существует. Исключение должно возникать только в случае сбоя сетевого соединения или чего-то подобного.Я предполагаю, что вывод заключается в том, что команде разработчиков для каждого приложения немного поручается определять границы между утверждениями и исключениями.
источник
Согласно этому документу http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#design-faq-general , «утверждение assert подходит для закрытых предварительных условий, постусловий и инвариантов класса. Проверка. Общедоступная проверка предварительных условий должна по-прежнему выполняться с помощью проверок внутри методов, которые приводят, в частности, к документированным исключениям, таким как IllegalArgumentException и IllegalStateException ".
Если вы хотите узнать больше о предварительном условии, постусловии и инварианте класса, проверьте этот документ: http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#usage-conditions . Он также содержит примеры использования утверждений.
источник
Тестирование на null будет обнаруживать только нули, вызывающие проблемы, тогда как try / catch, как у вас, обнаружит любую ошибку.
В общем, try / catch безопаснее, но немного медленнее, и вы должны быть осторожны, чтобы не перехватить все виды ошибок, которые могут возникнуть. Поэтому я бы сказал, используйте try / catch - однажды код getGroup может измениться, и вам просто может понадобиться эта более крупная сеть.
источник
Вы можете использовать это простое различие в уме при их использовании. Исключения будут использоваться для проверки ожидаемых и непредвиденных ошибок, называемых проверенными и непроверенными ошибками, в то время как утверждение используется в основном для целей отладки во время выполнения, чтобы увидеть, подтверждены ли предположения или нет.
источник
Признаюсь, меня немного смутил ваш вопрос. Когда условие утверждения не выполняется, выдается исключение. Как ни странно, это называется AssertionError . Обратите внимание, что он не отмечен, например (например) IllegalArgumentException, которое возникает в очень похожих обстоятельствах.
Итак, используя утверждения в Java
источник
См. Раздел 6.1.2 (Утверждения и другие коды ошибок) документации Sun по следующей ссылке.
http://www.oracle.com/technetwork/articles/javase/javapch06.pdf
Этот документ дает лучший совет о том, когда использовать утверждения. Цитата из документа:
"Хорошее практическое правило заключается в том, что вы должны использовать утверждение в исключительных случаях, о которых вы хотели бы забыть. Утверждение - это самый быстрый способ справиться и забыть условие или состояние, которое, как вы не ожидаете, придется иметь дело с."
источник
К сожалению, утверждения можно отключить. В процессе производства вам понадобится вся помощь, которую вы можете получить при отслеживании чего-то непредвиденного, поэтому утверждающие дисквалифицируют себя.
источник