抛出异常是否影响errno或设置最后一个错误码

Does throwing an exception affect errno or set last error code

假设 Foo 构造函数不调用任何影响 errno 的函数或 Windows 上类似 GetLastError() 的类似状态代码,是否可以保证

throw Foo

不影响这些值中的任何一个。那就是说,我可以 post-pone 错误代码的读取直到 Foo 的构造函数吗?如果标准没有指定,我最感兴趣的是 GCC、GNU/Linux 和 MinGW-SJLJ 变体的行为。

函数 GetLastError() 是 Windows 特定的非标准函数。异常不影响返回值:仅调用 OS 函数更新它(除非您调用 SetLastError())。

然而,抛出异常对范围内的自动对象有潜在影响:

15.2/1 As control passes from the point where an exception is thrown to a handler, destructors are invoked for all automatic objects constructed since the try block was entered. The automatic objects are destroyed in the reverse order of the completion of their construction.

如果任何此类对象的析构函数包含对 OS 的调用,这可能会影响 GetLastError()

总结一下: 首先调用 Foo 构造函数,然后调用已经完全构造的局部对象的析构函数,最后调用 throw "transfers controls" 到最近的异常处理程序。因此,预计不会调用任何库函数。该标准对任何基本流程控制语句(例如 break、continue 和 goto)使用相同的措辞("transfer control" 或 "pass control")。