По сути, обработка или исключение - это свойство вызывающей стороны , а не функции.
Например, в некоторых программах нет никакого смысла в обработке IOException (рассмотрите специальные утилиты командной строки для выполнения перехвата данных; они никогда не будут использоваться "пользователем", они - специальные инструменты, используемые специалистами). В некоторых программах целесообразно обрабатывать IOException в точке, находящейся «рядом» с вызовом (возможно, если вы получите FNFE для вашего конфигурационного файла, вы вернетесь к некоторым значениям по умолчанию, или посмотрите в другом месте, или что-то в этом роде природа). В других программах вы хотите, чтобы он долго пузырился перед обработкой (например, вы можете прервать его до достижения пользовательского интерфейса, после чего он должен предупредить пользователя о том, что что-то пошло не так.
Каждый из этих случаев зависит от приложения , а не от библиотеки . И все же, с проверенными исключениями, именно библиотека принимает решение. Библиотека Java IO принимает решение, что она будет использовать проверенные исключения (которые настоятельно рекомендуют обработку, которая является локальной для вызова), когда в некоторых программах лучшей стратегией может быть нелокальная обработка или вообще отсутствие обработки.
Это показывает реальный недостаток на практике с проверенными исключениями, и гораздо более фундаментально, чем поверхностный (хотя и важный) недостаток, заключающийся в том, что слишком много людей будут писать глупые обработчики исключений просто для того, чтобы компилятор отключился. Проблема, которую я описываю, является проблемой, даже когда опытные, добросовестные разработчики пишут программу.