如何使用<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 - 错误的地址