Влияет ли исключение на errno или устанавливает последний код ошибки
Предположим, Foo
конструктор не вызывает функцию, которая влияет errno
или аналогичные коды состояния, такие как GetLastError()
в Windows гарантируется, что
throw Foo
не влияет ни на одно из этих значений. Тем не менее, я могу отложить чтение кода ошибки до конструктора Foo? Если это не указано в стандарте, меня больше всего интересует поведение вариантов GCC, GNU/Linux и MinGW-SJLJ.
1 ответ
Функция GetLastError()
является специфичным для Windows и нестандартным. Исключения не влияют на возвращаемое значение: только вызовы функции ОС обновляют его (если вы не вызываете SetLastError()
).
Тем не менее, создание исключения имеет потенциальное влияние на автоматические объекты, находящиеся в области видимости:
15.2 / 1 Когда управление переходит из точки, где исключение выдается обработчику, деструкторы вызываются для всех автоматических объектов, созданных с момента ввода блока try. Автоматические объекты уничтожаются в порядке, обратном завершению их строительства.
Если деструктор любого из таких объектов содержит вызов к ОС, это может повлиять на GetLastError()
,
Подводя итог: сначала Foo
вызывается конструктор, затем вызывается деструктор уже полностью сконструированных локальных объектов, и, наконец, бросок "передает управление" ближайшему обработчику исключений. Таким образом, библиотечная функция не должна вызываться. Стандарт использует одну и ту же формулировку ("управление передачей" или "управление передачей") для любых элементарных операторов управления потоком, таких как break, continue и goto.