ОК, пришло время "Ответить на мой вопрос" ...
Во-первых, спасибо KennyTM за историю.По его словам, C ++ был NOT , разработанный с исключениями с первого дня, поэтому неудивительно, что обработка исключений в iostreams была включена позже.
Во-вторых, как указывает Нейл B, имеющие исключенияошибки преобразования входного формата были бы серьезной болью.Это удивило меня, потому что я рассматривал iostreams как простой слой оболочки файловой системы, и я вообще не рассматривал этот случай.
В-третьих, кажется, что BOOST действительно что-то приносит на вечеринку: Boost.IOStreams .Если я правильно понимаю, они обрабатывают низкоуровневый ввод-вывод и аспект буферизации потоков, оставляя обычную библиотеку c ++ IOStreams для решения проблем преобразования.Boost.IOStreams использует исключения так, как я ожидал.Если я правильно понимаю, пример Кенни также может выглядеть следующим образом:
#include <ostream>
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/stream.hpp>
int main () {
boost::iostreams::stream_buffer <boost::iostreams::file_source> buf("test.txt");
std::istream file(&buf);
try {
std::string buf;
while (std::getline(file, buf))
std::cout << "Read> " << buf << "\n";
}
catch (std::ios_base::failure::failure e) {
std::cout << "Exception opening/reading file\n";
}
std::cout.flush();
file.close();
return 0;
}
Я думаю с этой версией такие вещи, как «файл не найден», должны выдавать, но ошибки «istream»будет сообщено по Badbit / Failbit.