【问题标题】:Does throwing an exception affect errno or set last error code抛出异常是否会影响 errno 或设置最后一个错误代码
【发布时间】:2015-06-06 14:35:14
【问题描述】:

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

throw Foo

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

【问题讨论】:

    标签: c++ gcc throw errno getlasterror


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 确实如此,但是否可以保证异常处理代码不使用任何此类系统调用?
    • 但是 throw 语句中有一些我不完全了解的黑魔法......
    • @Dolda2000 好吧,确实,本地对象正在被破坏,它们的析构函数可能会调用操作系统函数(例如,如果 fstream 已打开)
    • @Christophe 这仅适用于在构造 Foo 之前调用这些析构函数。
    • @user877329 不一定:调用 Foo 构造函数,然后调用(已经完全构造的)本地对象的析构函数,然后将控制权传递给异常捕获器。 Demo
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多