gpt4 book ai didi

c++ - 如何使用 将 errno 转换为异常

转载 作者:IT老高 更新时间:2023-10-28 13:59:29 25 4
gpt4 key购买 nike

我看了一篇深思熟虑的series of blog posts关于新 <system_error> C++11 中的 header 。它说标题定义了 error_code表示操作(例如系统调用)返回的特定错误值的类。它说标题定义了 system_error类,它是一个异常类(继承自 runtime_exception ),用于包装 error_codes秒。

我想知道的是如何从 errno 实际转换系统错误变成 system_error这样我就可以扔了。例如,POSIX open函数通过返回 -1 并设置 errno 来报告错误,那么如果我想抛出异常,我应该如何完成下面的代码?

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() 时产生的异常不返回任何信息被调用。

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

system_error 有一个构造函数这需要一个 error_code作为它的论点,所以如果我可以转换 errnoerror_code那么其余的应该是显而易见的。

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

我在 ARM 处理器上使用 gcc 4.4.5,如果这很重要的话。

最佳答案

您在正确的轨道上,只需传递错误代码和 std::generic_category std::system_error constructor 的对象它应该可以工作。

例子:

#include <assert.h>
#include <errno.h>
#include <iostream>
#include <system_error>

int main()
{
try
{
throw std::system_error(EFAULT, std::generic_category());
}
catch (std::system_error& error)
{
std::cout << "Error: " << error.code() << " - " << error.what() << '\n';
assert(error.code() == std::errc::bad_address);
}
}

上述程序在我的系统上的输出是

Error: generic:14 - Bad address

关于c++ - 如何使用 <system_error> 将 errno 转换为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12171377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com