Обработка ошибок: различение «фатальных» ошибок и «непредвиденных ошибок ввода» - PullRequest
2 голосов
/ 11 июля 2011

Я работал над программой, которая читает файл XML, и если если streamstream не сможет открыть файл, он выдаст ошибку std :: ifstream :: fail.Это исключение выдается всякий раз, когда устанавливается std :: ifstream :: failbit или устанавливается std :: ifstream :: badbit, и они (по крайней мере, на мой взгляд) относятся к типу ошибок, которые требуют обработки исключений.

После того, как я открываю файл, я использую RapidXML для создания объекта DOM, и его функция синтаксического анализа выдаст rapidxml :: parse_error, если он потерпит неудачу.Это тип ситуации, когда ошибка не является фатальной - это просто неверный ввод.В любом случае, я думаю, что для fastxml все равно справедливо выдать исключение, когда он не может проанализировать файл xml, но даже если я так не думаю, это не имеет большого значения, потому что у меня не так много вариантов,Я мог отключить исключения в RapidXML, но тогда мне все равно пришлось бы обрабатывать эти исключительные случаи вручную, и гораздо проще обрабатывать их через механизм исключений.Тем не менее, это определенно темный район;оправдание для quickxml :: parse для генерирования исключений не так однозначно, как для ifstream.

Последний случай - когда я анализирую DOM и сталкиваюсь с неожиданным или неожиданным узлом.Ясно, что программа может продолжить выполнение, несмотря на неожиданный ввод, но я бы не хотел этого.Я мог бы предположительно выбросить здесь исключение, но я не уверен, имеет ли это смысл.

Итак, я прошу небольшой совет: каковы некоторые лучшие практики для обработки исключений?Я пытаюсь использовать идиому RAII в классе, который анализирует файлы, делая все это в конструкторе.Я использую boost :: shared_ptr для создания экземпляра класса анализа файла, поэтому, если конструктор выдает, boost :: shared_ptr перезапустит std :: bad_alloc после delete'ing класса анализа файла.

Я могу сделать аргументза то, что это происходит, когда XML-файл не соответствует тому, что ожидает этот класс, и я полагаю, что было бы целесообразно выдать исключение при представлении с непредвиденным вводом, но я действительно хотел бы убедиться, что мой мыслительный процессправильный.

1 Ответ

1 голос
/ 13 июля 2011

Ваш дизайн имеет смысл для меня: полностью инициализировать или выдать исключение. Единственные альтернативы, которые приходят на ум:

  • коды состояния
  • инициализация с максимальным усилием с помощью функций-членов статуса, чтобы выяснить, какие части допустимы

Единственный недостаток, который приходит на ум при подходе «все или ничего», - это «почти правильный» ввод. Возможно, приложение предпочло бы значение по умолчанию, если атрибут отсутствует.

...