Java-исключения сохраняют пример инкапсуляции - PullRequest
1 голос
/ 30 мая 2011

У меня есть класс, который управляет файлом на диске, сохраняя повторный перенос в виде xml.Поскольку он использует JAXB (но может использовать любую другую библиотеку xml, это не имеет значения), он может генерировать проверенные исключения jaxb (или любую другую библиотеку xml).
Чтобы сохранить инкапсуляцию, я должен «преобразовать» свое исключение из исходной библиотеки во что-то на логическом уровне моей библиотеки.Но я не хочу сильно увеличивать количество классов с небольшими, плохо соответствующими классами.Так как класс связан с файлом, я думаю, что IOException подходит для этого случая.

public void save(File file) throws IOException {
    try{
        JAXBContext jc = JAXBContext.newInstance(ArchiveInfo.class);
        Marshaller m = jc.createMarshaller();
        m.marshal(this, file);
    } catch (JAXBException jexc) {
        throw new IOException(jexc);
    }
}
  1. Согласны ли вы с этим решением, является ли хороший компромисс между простотой и правильностью?
  2. Мне повезло, потому что я нашел подходящее исключение.Если бы я не был, я бы обязательно определил свое собственное исключение, потому что использование класса Exception не очень удачно.(Заставляет вызывающую сторону перехватывать Exception, неявно перехватывая также RuntimeException).Разве это не аномалия в структуре исключений, что исключения времени выполнения имеют общего предка в классе RuntimeException, в то время как все проверенные исключения не имеют?

1 Ответ

2 голосов
/ 30 мая 2011

1) Я согласен с вами и склонен делать то же самое: ручное хранение большого количества типов исключений в большинстве случаев бесполезно. Все, что вам нужно на более высоких уровнях приложения, - это достаточная точность, чтобы предоставить пользователю существенную ошибку. В вашем случае «Файл не может быть прочитан», следовательно, IOException в порядке.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...