Влияет ли исключение на errno или устанавливает последний код ошибки

Предположим, Foo конструктор не вызывает функцию, которая влияет errno или аналогичные коды состояния, такие как GetLastError() в Windows гарантируется, что

throw Foo

не влияет ни на одно из этих значений. Тем не менее, я могу отложить чтение кода ошибки до конструктора Foo? Если это не указано в стандарте, меня больше всего интересует поведение вариантов GCC, GNU / Linux и MinGW-SJLJ.

2

Решение

Функция GetLastError() является специфичным для Windows и нестандартным. Исключения не влияют на возвращаемое значение: только вызовы функции ОС обновляют его (если вы не вызываете SetLastError()).

Тем не менее, создание исключения имеет потенциальное влияние на автоматические объекты, находящиеся в области видимости:

15.2 / 1 Когда управление переходит от точки, где исключение выдается обработчику, деструкторы вызываются для всех автоматических объектов
построено с момента ввода блока try Автоматические объекты
уничтожены в обратном порядке завершения их
строительство.

Если деструктор любого из таких объектов содержит вызов к ОС, это может повлиять на GetLastError(),

Подвести итоги: Сначала Foo вызывается конструктор, затем вызывается деструктор уже полностью сконструированных локальных объектов, и, наконец, бросок «передает управление» ближайшему обработчику исключений. Таким образом, библиотечная функция не должна вызываться. Стандарт использует одну и ту же формулировку («управление передачей» или «управление передачей») для любых элементарных операторов управления потоком, таких как break, continue и goto.

1

Другие решения


По вопросам рекламы [email protected]