检测析构函数因抛出异常而运行的时间?

Wil*_*mKF 20 c++ destructor exception raii

在C++中,在析构函数中检测它是否正在由于抛出异常而在堆栈展开期间运行而不是正常退出触发析构函数的范围有什么好方法?我想知道,以便我可以创建一个具有一些清理代码的类,该代码始终在正常退出时运行,但在发生异常时跳过.

小智 22

std::uncaught_exception()(定义中<exception>)将在析构函数中告诉您是否因为异常而调用它:

class A
{
public:
    ~A()
    {
        if (std::uncaught_exception()) {
            // Called because of an exception
        } else {
            // No exception
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 在C ++ 17中,它是[`std :: uncaught_exceptions()`](https://en.cppreference.com/w/cpp/error/uncaught_exception)(复数) (3认同)
  • 不如您想像的那么好-请参阅我的文章中的链接文章。 (2认同)

Sim*_*mon 6

也许这个文章将帮助您。本文将向您展示std :: uncaught_exception()的问题,并包含有关如何在析构函数中处理异常的建议。