如何检测异常何时飞行?

时间:2009-07-27 11:38:47

标签: c++ exception visual-c++

在C ++(MSVC)中,如何测试异常当前是否“在飞行中”。即,作为类析构函数的一部分被调用的代码可能会被调用,因为异常正在展开堆栈。如何检测这种情况,而不是正常情况下由于正常返回而调用析构函数? / p>

6 个答案:

答案 0 :(得分:8)

在你离开uncaught_exception()路径太远之前,请看http://www.gotw.ca/gotw/047.htm

答案 1 :(得分:7)

实际上可以这样做,在< exception>中调用uncaught_exception()头。 您可能想要这样做的一个原因是在析构函数中抛出异常之前,如果将析构函数作为堆栈展开的一部分调用,则会导致程序终止。 见http://msdn.microsoft.com/en-us/library/k1atwat8%28VS.71%29.aspx

答案 2 :(得分:1)

您可能正在寻找

// Returns true only if a thrown exception is being currently processed
namespace std {
    bool uncaught_exception();
};

http://msdn.microsoft.com/en-us/library/k1atwat8.aspx

答案 3 :(得分:1)

在C ++ 17中,引入了std::uncaught_exceptions(注意复数“s”)。这允许您捕获ctor中的“嵌套展开”计数,并在执行dtor时将捕获的值与当前值进行比较。这样你就可以知道你的对象是否被销毁,因为它的范围是通过异常(dtor当前值>捕获的值)留下的。

这意味着你终于可以在C ++中实现像“自动撤消”防护这样的东西了。 :)

答案 4 :(得分:-1)

我不确定是否有更好的方法,但是你能否抓住并重新抛出异常?

答案 5 :(得分:-1)

一种方法是用您的own替换异常处理机制。

另一方面,它总是引发这个问题 - 为什么要这样做呢?

主题上的更多链接:Reversing Microsoft Visual C++ Part I: Exception HandlingThe exception model