Подтвердить что ты не робот

Как преобразовать errno в исключение, используя <system_error>

Я прочитал вдумчивый ряд сообщений в блоге о новом заголовке <system_error> в С++ 11. В нем говорится, что заголовок определяет класс error_code, который представляет определенное значение ошибки, возвращаемое операцией (например, системный вызов). В нем говорится, что заголовок определяет класс system_error, который является классом исключений (наследуется от runtime_exception) и используется для переноса error_codes s.

Я хочу знать, как фактически преобразовать системную ошибку из 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, поэтому, если я могу просто преобразовать errno в error_code, тогда остальное должно быть очевидно.

Это похоже на действительно основную вещь, поэтому я не знаю, почему я не могу найти хороший учебник по этому вопросу.

Я использую gcc 4.4.5 на процессоре ARM, если это имеет значение.

4b9b3361

Ответ 1

Вы на правильном пути, просто передайте код ошибки и 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';
    }
}

Выход из вышеуказанной программы в моей системе

Error: system:14 - Bad address