Я все время придерживаюсь концептуального решения о создании структуры обработки исключений для моего проекта.
Предположим, что у вас есть пример:
public abstract class Data {
public abstract String read();
}
И два подкласса FileData, который считывает ваши данные из определенного файла и StaticData, который возвращает только определенные предопределенные постоянные данные.
Теперь, прочитав файл, исключение IOException может быть выбрано в FileData, но StaticData никогда не будет бросать. Большинство руководств по стилю рекомендуют распространять исключение в стек вызовов до тех пор, пока не будет достаточно достаточного контекста для эффективного решения проблемы.
Но я действительно не хочу добавлять предложение throws к абстрактному методу read(). Зачем? Поскольку данные и сложная техника, использующая его, ничего не знают о файлах, он просто знает о Data. Более того, могут существовать и другие подклассы данных (и многие из них), которые никогда не бросают исключения и не передают данные безупречно.
С другой стороны, исключение IOException необходимо, поскольку если диск нечитабелен (или какой-либо такой), должна быть выбрана ошибка. Таким образом, единственный выход, который я вижу, - это захватить исключение IOException и выбросить на него некоторое RuntimeException.
Это правильная философия?