Функция GetLastError()
является специальной и нестандартной Windows. Исключения не влияют на возвращаемое значение: только вызовы функции ОС обновляют его (если вы не вызываете SetLastError()
).
Тем не менее, бросать исключение имеет потенциальное воздействие на автоматических объектах, которые были в области видимости:
15,2/1 Как управление переходит от точки, где возникает исключение в обработчик, деструкторы вызываются для все автоматические объекты , созданные с момента ввода блока try. Автоматические объекты уничтожены в порядке, обратном порядку завершения их строительства .
Если деструктор любых таких объектов содержит вызов ОС, это может повлиять на GetLastError()
.
Резюмируя: Сначала Foo
вызывается конструктор, то деструкторы уже полностью построенных локальных объектов, называется, и, наконец, «контролирует передает» бросок до ближайшего обработчика исключений. Поэтому функция библиотеки не будет вызвана. Стандарт использует ту же формулировку («управление передачей» или «контроль прохождения») для любых элементарных операторов управления потоком, таких как break, continue и goto.
Действительно, но гарантируется ли, что код обработки исключений не использует никаких таких системных вызовов? – Dolda2000
Но есть черная магия внутри оператора throw. У меня нет полного знания ... – user877329
@ Dolda2000 ну, в самом деле, локальные объекты разрушаются, их деструктор может вызвать функции ОС (например, если fstream был открыт) – Christophe