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

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

я должен также упомянуть, что UberJar и Оттенок являются плагинами для Maven1 и Maven2 соответственно. Как упомянуто ниже, можно также использовать плагин блока (который в действительности намного более мощен, но намного тяжелее правильно настраивать).

54
задан Hash 27 February 2017 в 02:13
поделиться

4 ответа

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

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

В качестве альтернативы это Весь разумный (ИМО) использовать исключения для всего. Лично я вообще не часто использую утверждения, но в некоторой степени это вопрос личных предпочтений. (Конечно, могут быть объективные аргументы за и против утверждений, но это

85
ответ дан 7 November 2019 в 07:49
поделиться

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

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

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

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

@Mario Ortegón прокомментировал так:

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

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

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

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

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

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

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

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

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

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

25
ответ дан 7 November 2019 в 07:49
поделиться

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

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

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

6
ответ дан 7 November 2019 в 07:49
поделиться

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

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

1
ответ дан 7 November 2019 в 07:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: