Я работал над программой, которая читает файл XML, и если ifstream не может открыть файл, она выдает std::ifstream::failure. Это исключение выдается всякий раз, когда устанавливается std::ifstream::failbit или std::ifstream::badbit, и они (по крайней мере, на мой взгляд) относятся к типу ошибок, требующих обработки исключений.
После того, как я открою файл, я использую RapidXML для создания объекта DOM, и его функция синтаксического анализа выдаст Rapidxml::parse_error в случае сбоя. Это тип ситуации, когда ошибка на самом деле не является фатальной — это просто неверный ввод. В любом случае, я думаю, что для rapidxml по-прежнему справедливо генерировать исключение, когда ему не удается разобрать файл xml, но даже если я так не думаю, это не имеет большого значения, потому что у меня не так много вариантов . Я мог бы отключить исключения в RapidXML, но тогда мне все равно пришлось бы обрабатывать эти исключительные случаи вручную, и гораздо проще обрабатывать их с помощью механизма исключений. Однако это определенно темная область; обоснование для Rapidxml::parse генерирования исключений не столь однозначно, как для ifstream.
Последний случай — когда я анализирую DOM и натыкаюсь на неожиданный или непредвиденный узел. Понятно, что программа может продолжать выполняться, несмотря на неожиданный ввод, но мне бы этого не хотелось. Я мог бы создать здесь исключение, но я не уверен, что это имеет смысл.
Итак, я прошу небольшого совета: каковы лучшие методы обработки исключений? Я пытаюсь использовать идиому RAII в классе, который анализирует файлы, делая все это в конструкторе. Я использую boost::shared_ptr для создания экземпляра класса синтаксического анализа файлов, поэтому, если конструктор выдает исключение, boost::shared_ptr повторно сгенерирует std::bad_alloc после удаления класса синтаксического анализа файлов.
Я могу привести аргумент в пользу того, чтобы это происходило, когда файл XML не соответствует тому, что ожидает этот класс, и я полагаю, что было бы разумно генерировать исключение при представлении непредвиденного ввода, но я действительно хотел бы убедиться, что что мой мыслительный процесс правильный.