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