Если часть распределения ресурсов конструктора, например. сбой оболочки сокета RAII, я просто выбрасываю исключение и покончу с этим? Или мне следует использовать способ std::fstream
, где вам нужно проверить is_open()
после создания объекта?
Первый кажется более соответствующим названию выделения ресурсов при инициализации, но тогда почему стандартная библиотека в основном заставляет вас проверять код ошибки перед использованием объекта?
Я имею в виду пример на справочной странице для basic_fstream
(перефразировано, добавлены примечания):
int main() {
std::string filename = "test.bin";
std::fstream s(filename);
if (!s.is_open()) { // should my socket class require the user to do this?
std::cout << "failed to open " << filename << '\n';
} else {
// ... use it
}
}
fstream
. В противном случае сгенерируйте исключение. Проблема с подходомfstream
возникает, если происходит сбой, и код забывает проверить (например, используяis_open()
) перед выполнением действий, предполагающих отсутствие ошибки. Проблема с созданием исключения заключается в том, что оно заставляет вызывающую сторону реагировать на сбой, даже если вызывающая сторона может безопасно ее игнорировать. - person Peter   schedule 15.09.2020