Я понимаю, что "Исключения для исключительных случаев" [a], но кроме того, что они повторяются over и over, я никогда не нашел реальной причины для этого факта.
Поскольку они останавливают выполнение, имеет смысл, что вы не захотите их для простой условной логики, но почему бы не ввести проверку?
Скажите, что вам нужно было пройти через группу входов и поймать каждое исключение, чтобы сгруппировать их вместе для уведомления пользователя... Я постоянно вижу, что это как-то "неправильно", потому что пользователи все время вводят неверный ввод, но эта точка кажется на основе семантики.
Вход не является ожидаемым и, следовательно, является исключительным. Выброс исключения позволяет мне точно определить, что было не так, как StringValueTooLong или IntegerValueTooLow или InvalidDateValue или что-то еще. Почему это считается неправильным?
Альтернативой выдаче исключения будет либо возврат (и, в конечном счете, сбор) кода ошибки, либо еще хуже строка ошибки. Затем я бы либо показал эти строки ошибок напрямую, либо проанализировал коды ошибок, а затем отобразил соответствующие сообщения об ошибках пользователю. Разве исключение не считалось бы податливым кодом ошибки? Зачем создавать отдельную таблицу кодов ошибок и сообщений, когда они могут быть обобщены с помощью функции исключения, уже встроенной в мой язык?
Кроме того, я нашел эту статью Мартина Фаулера относительно того, как обращаться с такими вещами - шаблон уведомления. Я не уверен, как я вижу это как нечто иное, кроме Исключения, которые не останавливают выполнение.
a: Всюду я читал что-нибудь об Исключениях.
--- Редактировать ---
Было сделано много замечательных замечаний. Я прокомментировал большинство и хорошие отзывы, но я еще не полностью убежден.
Я не хочу защищать Исключения как надлежащие средства для разрешения Input Validation, но я хотел бы найти веские причины, по которым практика считается настолько злой, когда кажется, что большинство альтернативных решений - это всего лишь Исключения в маскировке.