获取std :: fstream失败错误消息和/或异常

sof*_*ofr 32 c++

我正在使用fstream.有没有办法获得失败消息/异常?

例如,如果我无法打开文件?

小智 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++标准没有指定抛出的异常包含任何错误消息,因此您在此处处于特定于实现的区域.


Dou*_*oug 9

简答:不.即使检查errno您检测故障(例如使用后bad(),fail()),各种操作后无法可靠地工作.创建ifstream/ ofstream包装无法打开的文件不一定会设置失败位,直到您尝试读取,写入或关闭它.

答案很长:你可以调用ios::exceptions(ios_base::iostate)请求ios_base::ios_failure在设置相应的位(badbit,failbit,eofbit)时抛出异常,但是这个(至少在GNU和Microsoft C++库上)不会比手动检查更多信息比特,最终在很大程度上毫无意义,恕我直言.


sof*_*ofr 3

通过检查,我发现也errno确实GetLastError()设置了最后一个错误并检查它们非常有帮助。要获取字符串消息,请使用:

strerror(errno);
Run Code Online (Sandbox Code Playgroud)

  • GetLastError() 仅适用于 Windows。 (6认同)
  • 如果您提供一些有关如何使用此函数的代码片段,那就太好了 (5认同)