2015-06-06 5 views
2

, предполагающей Foo конструктор не вызывает какой-либо функции, которые влияют на errno или подобные коды состояния, как GetLastError() на Windows, это гарантирует, чтоли бросать исключение влияет на ERRNO или установить код последней ошибки

throw Foo 

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

ответ

1

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

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

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

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

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

+1

Действительно, но гарантируется ли, что код обработки исключений не использует никаких таких системных вызовов? – Dolda2000

+0

Но есть черная магия внутри оператора throw. У меня нет полного знания ... – user877329

+0

@ Dolda2000 ну, в самом деле, локальные объекты разрушаются, их деструктор может вызвать функции ОС (например, если fstream был открыт) – Christophe