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



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

throw Foo

不影响这些值。也就是说,我可以将读取错误代码的时间推迟到Foo的构造函数吗?如果标准没有指定,我对GCC、GNU/Linux和MinGW-SJLJ变体的行为最感兴趣。

GetLastError()函数是Windows专用的非标准函数。异常不影响返回的值:只有调用OS函数更新它(除非你调用SetLastError())。

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

15.2/1当控制从抛出异常的点传递到处理程序时,将为所有自动对象调用析构函数在进入try块后构造。自动对象是销毁的顺序与完成的顺序相反建设。

如果任何此类对象的析构函数包含对操作系统的调用,这可能会对GetLastError()产生影响。

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

相关内容

最新更新