Я прочитал вдумчивый ряд сообщений в блоге о новом заголовке <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, если это имеет значение.