Разница между if else и try catch?

Здравствуйте.
Допустим ситуацию в которой пользователь вводит число-делитель.
Как правильно проверить его корректность, через if, или выбросить соответствующее исключение?
Вообще интересует более абстрактный ответ. Когда использовать одно, а когда другое?
  • Вопрос задан
  • 1126 просмотров
Решения вопроса 1
@Akela_wolf
Extreme Programmer
Есть такой принцип: "если убрать все обработчики исключений, программа должна нормально функционировать при условии ввода корректных данных" (Д.Томас, Э.Хант "Программист-прагматик"). Поэтому вопрос - является ли введенный пользователем нуль корректными данными? Если да - то его надо оборачивать в if. Если же это некорректные с точки зрения программы данные - то можно кидать исключение.

То есть исключение должно выбрасываться при поступлении на вход программы некорректных данных. А какие именно данные считать некорректными - это определяет разработчик (или заказчик) программы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
@maximsemin23
Имхо: Если есть возможность сделать без try catch, то лучше делать без try catch. Во всяком случае так работает с null pointer exception:
// Good
if (x != null) {
    
} else {

}

// Bad
try {
     // action with x
} catch(NullPointerEcxeption e) {

}
Ответ написан
Комментировать
@nApoBo3
Это древний холивар.

Личное мое имхо, исключение, это авариное завершение приложения, во всех не аварийных случаях их использовать не следуют, хотя бы из соображений производительности.
Ответ написан
@UniverseElement
Если вы можете выполнить проверку условия в блоке if else, то используйте его + оберните его в try catch, чтобы перехватить непредвиденное исключение, если оно возникнет.
Ответ написан
Комментировать
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Стоит также обратить внимание на то, что есть try with resources, что позволяет после работы автоматически закрывать соединение и т.д. Т.е. все, что имплементирует интерфейс AutoClosable. Например, подключиться к БД, что-то сделать, а затем закрыть соединение. Как мимнимум в if else этого нет.
С другой стороны try catch более тяжелый с точки зрения производительности.
Ответ написан
Комментировать
AgentSmith
@AgentSmith
Это мой правильный ответ на твой вопрос
Всегда надо помнить, что Исключение - это довольно дорогая операция и без необходимости лучше её не использовать
Ответ написан
Комментировать
mayton2019
@mayton2019 Куратор тега Java
Bigdata Engineer
try-catch - это эволюционно развитый if-else. Вот те кто кодили на "C" знают как тяжело работать с файловыми операциями. Любой fopen,fread e.t.c. надо проверять на код возврата и обеспечивать аварийный выход с очисткой (!) всех ресурсов. И вот отслеживание всех ресурсов и их состояний это нетривиальная задача. Для этого создали try-with-resources. И вообще возврат в это тяжелое мракобесное время проверок errorcode - никому не советую.

В случае с делением на 0 (ArithmeticException). Если вы рисуете на экране график функции - то возможна ситуация
где будет много делений на нуль. Тогда обработка исключений может стать performance issue. Это правда.

Может помочь декомпозиция формулы с делением на результат с Option[Int] (в Scala и Java это уже рабоатет) и возвращать неопределенное значение None в случае когда в знаменателе стоит ноль. Вообще в языках ФП данный подход очень рекомендуется т.к. в этих языках есть синтаксический сахар для быстрого сворачивания (flatMap) списков таких опциональных значений.

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы