У меня есть некоторый код, который выглядит немного как это:Должен ли я писать конец файла в деструкторе?
void writeToStream(std::ostream & outputStream)
{
MyXmlWriter xmlWriter{ outputStream };
xmlWriter.addNode();
xmlWriter.addNode();
xmlWriter.close(); // should this be called in `MyXmlWriter` destructor?
}
Тесной функция записывает некоторые XML близкие тег, файл может быть обработан должным образом. Конструктор записывает заголовок xml-файла. Можно было бы рассмотреть код очистки xmlWriter.close();
. Общим советом для C++ является удаление кода очистки в деструкторы. Таким образом, вы никогда не сможете забыть правильно очистить. Однако в нашем случае код очистки может быть сброшен. (Представьте себе, что file
может иметь исключения включены, пишет в файл может выйти из строя). Таким образом, если функция close()
вызывается в деструкторе, то он должен быть заключен в примерочных поймать блок, который съедает все исключения брошено:
MyXmlWriter::~MyXmlWriter()
{
try
{
close();
}
catch (...)
{
}
}
Однако в этом случае вызывающий абонент не будет уведомлен о каких-либо ошибках. Функция writeToStream()
не сможет записать закрывающие теги xml в файл, не зная об этом вызывающего. Какова наилучшая практика в этой ситуации?
Привет, пожалуйста, не редактируйте мои ответы. Я обычно знаю, что я делаю;) – Potatoswatter
@Potatoswatter: Редактирование ответов прямо разрешено этим сайтом, и не совсем правильно просить, чтобы кто-то оставил вас в покое. Тем не менее, редактирование было неправильным. –
@LightnessRacesinOrbit Я не согласен в принципе и на практике. Нет причин, по которым я не могу отказаться от публичных исправлений. Но это обсуждение мета. – Potatoswatter