小智 30
默认情况下,流不会在出错时抛出异常,它们会设置标志.您可以使用stream的exception()成员函数使它们抛出异常:
ifstream ifs;
ifs.exceptions( std::ios::failbit ); // throw if failbit get set
Run Code Online (Sandbox Code Playgroud)
从理论上讲,你可以这样做:
try {
int x;
ifs >> x;
}
catch( const std::exception & ex ) {
std::cerr << "Could not convert to int - reason is "
<< ex.what();
}
Run Code Online (Sandbox Code Playgroud)
遗憾的是,C++标准没有指定抛出的异常包含任何错误消息,因此您在此处处于特定于实现的区域.
简答:不.即使检查errno您检测故障(例如使用后bad(),fail()),各种操作后无法可靠地工作.创建ifstream/ ofstream包装无法打开的文件不一定会设置失败位,直到您尝试读取,写入或关闭它.
答案很长:你可以调用ios::exceptions(ios_base::iostate)请求ios_base::ios_failure在设置相应的位(badbit,failbit,eofbit)时抛出异常,但是这个(至少在GNU和Microsoft C++库上)不会比手动检查更多信息比特,最终在很大程度上毫无意义,恕我直言.
通过检查,我发现也errno确实GetLastError()设置了最后一个错误并检查它们非常有帮助。要获取字符串消息,请使用:
strerror(errno);
Run Code Online (Sandbox Code Playgroud)