1) Я согласен с вами и склонен делать то же самое: ручное хранение большого количества типов исключений в большинстве случаев бесполезно. Все, что вам нужно на более высоких уровнях приложения, - это достаточная точность, чтобы предоставить пользователю существенную ошибку. В вашем случае «Файл не может быть прочитан», следовательно, IOException в порядке.
2) Да, это давно задокументированный недостаток механизма исключений в Java ... Некоторые даже сказали бы, что механизм исключений в Java имеет недостатки в своем корне (проверенные исключения используются в большинстве случаев неправильно). Во всяком случае, в вашем случае я иногда использую ловушку InvalidStateException или IllegalArgumentException. Конечно, вы всегда можете создавать свои собственные исключения, если вам нужно передать более точное значение на верхние уровни вашего приложения. Но помни: ПОЦЕЛУЙ:)