如何让标准文件流返回有用的错误消息?

5 c++ exception ifstream

#include <fstream>
#include <iostream>
#include <exception>


int main(int argc, char **argv)
{   try
    {   std::ifstream sFile(argv[1]);
        sFile.exceptions(std::ios::badbit | std::ios::failbit);
    } catch (const std::exception &_r)
    {   std::cerr << "exception: " << _r.what() << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果传入的文件不存在,此代码将使用 g++ 4.5.2 打印出来(是的,我知道这是一个非常旧的版本,但我没有足够的影响力来更改它):

“例外:basic_ios::清除”

使用 Visual C++ 12:

“异常:ios_base::failbit 设置:iostream 流错误”

考虑到系统错误消息很久以前就已经引入了,我认为这是不可接受的。

Sam*_*hik 1

系统调用失败后:

std::cout << strerror(errno) << std::endl;
Run Code Online (Sandbox Code Playgroud)

将产生一些有用的错误消息。您将需要#includestring.h 和 errno.h。

C++ 异常在这里没有用处。这些 POSIX 函数通常会产生更有意义的诊断。