抛出异常是否会影响errno或设置上一个错误代码

时间:2015-06-06 14:35:15

标签: c++ gcc throw errno getlasterror

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

throw Foo

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

1 个答案:

答案 0 :(得分:1)

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

尽管如此,抛出异常会对范围内的自动对象产生潜在影响:

  

15.2 / 1 当控件从抛出异常的位置传递到处理程序时,将为所有自动对象调用析构函数   从输入try块开始构造。自动对象是   以完成他们的相反顺序销毁   构造

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

总结一下: 首先调用Foo构造函数,然后调用已完全构造的本地对象的析构函数,最后抛出“转移控件”到最近的异常处理程序。因此,预计不会调用库函数。该标准对任何基本流控制语句使用相同的措辞(“传输控制”或“传递控制”),例如break,continue和goto。