我有这段代码,只是想知道为什么它不会抛出异常(或者在这种情况下它应该这样做)。
如果函数无法打开文件,则会为流设置failbit状态标志(如果使用成员例外注册了状态标志,则可能会抛出ios_base :: failure)。
#include <fstream>
#include <exception>
#include <iostream>
int main() {
std::ofstream fs;
try {
fs.open("/non-existing-root-file");
} catch (const std::ios_base::failure& e) {
std::cout << e.what() << std::endl;
}
if (fs.is_open())
std::cout << "is open" << std::endl;
else
std::cout << "is not open" << std::endl;
return 0;
}
答案 0 :(得分:3)
你没有遵循兔子追踪all of the way down
您需要使用std::ios::exceptions
告诉它您想要例外。如果不这样做,它会通过failbit
状态标志指示失败。
// ios::exceptions
#include <iostream> // std::cerr
#include <fstream> // std::ifstream
int main () {
std::ifstream file;
///next line tells the ifstream to throw on fail
file.exceptions ( std::ifstream::failbit | std::ifstream::badbit );
try {
file.open ("test.txt");
while (!file.eof()) file.get();
file.close();
}
catch (std::ifstream::failure e) {
std::cerr << "Exception opening/reading/closing file\n";
}
return 0;
}
答案 1 :(得分:0)
我不认为fstream会因打开文件失败而抛出异常。你必须用bool fstream :: is_open()检查它。
答案 2 :(得分:0)
您需要使用failbit
注册std::ios::exceptions()
标记才能投掷,但您还没有完成。