Я бы сказал, что, как правило, каждый фундаментализм ведет в ад.
Вы, конечно, не захотите закончить потоком, управляемым исключениями, но вообще избегать исключений - тоже плохая идея. Вы должны найти баланс между обоими подходами. Что бы я не делал, это создавал тип исключения для каждой исключительной ситуации. Это не продуктивно.
Обычно я предпочитаю создавать два основных типа исключений, которые используются во всей системе: LogicalException и TechnicalException . Их можно дополнительно различать по подтипам, если это необходимо, но обычно это не является необходимым.
Техническое исключение означает действительно неожиданное исключение, такое как отключение сервера базы данных, соединение с веб-службой, вызвало IOException и так далее.
С другой стороны, логические исключения используются для распространения менее серьезной ошибочной ситуации на верхние уровни (как правило, некоторый результат проверки).
Обратите внимание, что даже логическое исключение предназначено не для регулярного использования для управления потоком программы, а для того, чтобы подчеркнуть ситуацию, когда поток действительно должен завершиться. При использовании в Java оба типа исключений являются RuntimeException подклассами, а обработка ошибок в значительной степени ориентирована на аспекты.
Так что в примере входа в систему может быть целесообразно создать что-то вроде AuthenticationException и различать конкретные ситуации по значениям перечисления, таким как UsernameNotExisting , PasswordMismatch и т. Д. Тогда вы не получите иметь огромную иерархию исключений и может поддерживать блоки catch на поддерживаемом уровне. Вы также можете легко использовать некоторый общий механизм обработки исключений, так как вы классифицировали исключения и хорошо знаете, что распространять до пользователя и как.
Мы обычно используем исключение LogicalException во время вызова веб-службы, когда ввод пользователя был неверным. Исключение маршалируется в детали SOAPFault, а затем снова демаршируется в исключение на клиенте, что приводит к отображению ошибки проверки в одном определенном поле ввода веб-страницы, поскольку исключение имеет правильное сопоставление с этим полем.
Это, конечно, не единственная ситуация: вам не нужно нажимать веб-сервис, чтобы вызвать исключение. Вы можете сделать это в любой исключительной ситуации (например, в случае необходимости быстрого отказа) - все это на ваше усмотрение.