Исключение Против Утверждения


в чем разница между обработкой исключений Java и использованием assert условиях?

известно, что Assert имеет два типа. Но когда мы должны использовать assert ключевое слово?

8   51   2009-08-14 10:20:38

8 ответов:

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

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

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

Ява утверждения построены на Java-исключения и обработка исключений. Действительно, когда утверждение Java терпит неудачу, результатом является исключение AssertionError, которое может быть поймано как любое другое исключение Java. Основные различия между исключениями и утверждениями:

  • утверждения предназначены для использования исключительно в качестве средства обнаружения ошибок программирования, ака ошибок. Напротив, исключение может указывать на другие виды ошибок или " исключительные" условие; например, недопустимый пользовательский ввод, отсутствующие файлы, полная куча и так далее.
  • язык Java обеспечивает синтаксическую поддержку утверждений, в виде assert заявление. Сравните следующее:

    if (x != y) {
         throw new SomeException("x != y");
    }
    
    assert x != y;
    
  • самое главное, Java позволяет включать или отключать проверку утверждений глобально или на отдельных классах при запуске JVM.

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

@Марио Ортегон прокомментировал таким образом:

"выключение" связано с тем, что утверждения могут использоваться для проверки результата оптимизированного алгоритма путем сравнения его реализации с известным, но медленным алгоритмом. Таким образом, в развитии это нормально ссылаться на то, что O(N^3) метод, чтобы утверждать, что O(log N) алгоритм работает по назначению. Но это то, что вы не хотите в производство.

думаете ли вы, что это хорошая практика чтобы отключить утверждения в производство, это определенно плохая практика для записи утверждений, которые оказывают значительное влияние на производительность при включении. Зачем? Потому что это означает, что у вас больше нет возможности включить утверждения в производстве (для отслеживания проблемы) или в вашем стресс-тестировании / тестировании емкости. По-моему, если нужно сделать O(N^3) pre / post-condition тестирование, вы должны сделать это в ваших модульных тестов.

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

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

Ссылка: http://geekexplains.blogspot.com/2008/06/asserions-in-java-assertions-vs.html

пример хорошего использования Assert:

assert flibbles.count() < 1000000; // too many flibbles indicate something is awry
log.warning("flibble count reached " + flibbles.count()); // log in production as early warning

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

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

cf. http://c2.com/cgi/wiki?FailFast см. также мою копию ответа на c#: "отладка".Конкретно утверждать и исключений

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

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

Допустим, вы пишете заявление в банк. Как разработчик вы не можете поддерживать все возможные финансовые условия. Поэтому перед началом кода Вы получаете спецификацию от банка, которая дает вам действительные диапазоны, которые должно поддерживать это приложение. Таким образом, ваше приложение разработано по контракту (по спецификации от банка). Этот договор будет определять фундаментальные принципы, которые всегда должны быть верными для того, чтобы ваше приложение работало. Эти фундаментальные принципы называются "инвариантами" (потому что они не могут измениться). Дизайн по контракту упрощает вашу жизнь как разработчика-вы несете ответственность только за поддержку объема работ, определенного в контракте.
Важно проверить значения этих инвариантов в вашем коде, но вы не должны проверять их, как если бы они были исключениями, и пытаться обойти их. Если они ошибаются - вы должны потерпеть неудачу потому что вкладчики не выполнили свои договорные обязательства.

интересно то, что если вы не поставите утверждение в критическое место и инварианты станут недействительными - ваш код все равно потерпит неудачу. Вы просто не будете знать, почему. Итак, подведем итог-утверждения используются для проверки инвариантов. Они идут рука об руку с принципом" дизайн по контракту". Используйте их для отладки проблемы, вот почему они отключены в производстве.

другой пример: если вы полагаетесь на внешнюю библиотеку, которой вы не полностью доверяете - вы можете использовать операторы assert при ее вызове.

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

исключение составляют специальные системные события, которые всегда могут произойти: FileNotFound, ConnectionToServerLost и др.

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

но утверждение может включать и отключать по желанию программиста,

в компиляторе, если вы используете "java-ea JavaFileName" или " java-enableasserations JavaFileName" вы можете скомпилировать с утверждением

Если программистам это не нужно, " java-da JavaFileName "или" java-disableasserations JavaFileName " они могут отключить утверждение.

этот объект не в Обработка исключений

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