如何使用<system_error>将errno转换为exception

我阅读了一系列关于C ++ 11中新的<system_error>头文件的深思熟虑的博客文章 。 它说,头文件定义了一个error_code类,它表示一个操作(如系统调用)返回的特定错误值。 它说,头文件定义了一个system_error类,它是一个exception类(inheritance自runtime_exception ),用于包装error_codes

我想知道的是如何实际上从errno转换系统错误到system_error所以我可以把它扔掉。 例如,POSIX open函数通过返回-1和设置errno报告错误,所以如果我想抛出exception,我应该如何完成下面的代码?

 void x() { fd = open("foo", O_RDWR); if (fd == -1) { throw /* need some code here to make a std::system_error from errno */; } } 

我随机尝试:

 errno = ENOENT; throw std::system_error(); 

但是当调用what()时,得到的exception不会返回任何信息。

我知道我可以throw errno; 但我想用正确的方式使用新的<system_error>标题。

有一个system_error的构造函数, system_error接受一个error_code作为参数,所以如果我可以将errno转换成error_code那么其余部分应该是显而易见的。

这似乎是一个非常基本的东西,所以我不知道为什么我找不到一个很好的教程。

如果有问题,我在ARM处理器上使用gcc 4.4.5。

你在正确的轨道上,只是将错误代码和std::system_category对象传递给std::system_error 构造函数 ,它应该工作:

例:

 #include <iostream> #include <system_error> int main() { try { throw std::system_error(EFAULT, std::system_category()); } catch (std::system_error& error) { std::cout << "Error: " << error.code() << " - " << error.what() << '\n'; } } 

从我的系统上面的程序输出是

错误:系统:14  - 错误的地址