Доброго вечера.
Обычно, когда речь заходит об исключениях, в дискуссии превалируют два подхода. Первый - применять исключения для обработки любых ошибок. Читал даже в "Чистом коде", что неплохо было бы выкинуть return null и заменить их исключениями, чтобы не на null проверять, а исключения обрабатывать. Некоторые используют исключения даже когда ошибки толком и нет, а есть определенная ситуация - например, нет денег на счету, кидаем исключение; в объекте нет нужного поля или nonce некорректен - кидаем исключение.
А второй - применять исключения только для некоторых исключительных ситуаций, т.е. когда корректная работа программы после такой ситуации не представляется возможной. И никогда не пользоваться исключениями, если не нужно делать что-то значимое. Остальные ошибки обрабатывать штатными средствами.
Я весьма редко использую исключения, в основном, при работе с БД или со сторонними API. Но я понимаю, почему жив первый вариант - исключения очень удобны. Какой подход лучше и корректнее?
Заранее спасибо.
Первый вариант предпочтительнее. Потому что первый вариант - это рецепт: всегда кидайте исключение когда функция не может вернуть (или сделать) то что от неё ждут.
Второй вариант неспособен предоставить однозначного решения, потому что о том "что такое исключительная ситуация на уровне программы" можно рассуждать бесконечно.
Декларируемые исключения Java — это плохо. Однако эти декларируемые исключения позволяют осознать, что есть три типа аварий.
1. Среда исполнения чувствует себя плохо, исполнение программы под угрозой (сработала самопроверка в какой-то части программы, не подконтрольной программисту). Например, срабатывание какого-то встроенного детектора, определяющего запись в чужую память. Выпадают где угодно. Их на практике не приходится ни выбрасывать, ни ловить.
2. Нарушена логика программы (сработала самопроверка, зависящая от программиста). Неверный аргумент, выход за границу массива. Выпадают где угодно. Их часто выбрасывают и крайне редко ловят.
3. Нестабильная часть программного окружения чувствует себя плохо. Файл не найден, нет связи. Выпадают в определённых точках. Часто выбрасывают и часто ловят. В Java только их требуется декларировать.
Таким образом, ваш холивар относится к вопросу: выбрасывать ли исключение, если случилась авария 3-го типа? Я лично замечал подобные вопросы только в одном языке — Си++. Думаю, это связано с двумя вещами. 1) Большие издержки, связанными с определёнными методиками обработки исключений. 2) Довольно невнятное поведение Си++ при выпадении исключения из конструктора.
Если же отойти от недостатка конкретного языка — даже по поводу обычного HTTP 404 есть «путь Indy» и «путь cURL» — выбросить исключение и сообщить о ненайденном документе другими методами. За первое и за второе можно найти кучу аргументов.