std :: uncaught_exception和Microsoft __uncaught_exception之间的区别?

时间:2014-10-25 17:35:09

标签: c++ exception std

似乎C ++ std库有std::uncaught_exception,而Microsoft有exact function

但微软也有__uncaught_exception。我没有看到文档中有任何明显的差异。那么,有区别吗?如果两者都可以使用,我应该更喜欢一个,另一个,还是使用它们只是为了确定?

// Option 1
if (uncaught_exception())
{
    // report it.
}

// Option 2
if (__uncaught_exception())
{
    // report it
}

// Option 3
if (uncaught_exception() || __uncaught_exception())
{
    // report it
}

1 个答案:

答案 0 :(得分:0)

是否存在差异,无关紧要。导致创建该功能的前提本身就存在缺陷,而且基本上没用。

该函数是一个测试,用于确定在执行此代码(析构函数或从析构函数调用的代码)时是否存在异常,这将指示堆栈正在展开并且第二个异常将终止该计划。

除了赢了之外。两个异常不能在同一堆栈帧中激活,但在飞行中可能有多个异常。抛出异常,堆栈开始展开,本地对象的一个​​析构函数最终调用在内部 try块时抛出异常的代码。完全合法和精细,两个例外在飞行中同时展开堆栈的不同部分。

因此,函数std::uncaught_exception不能用于确定抛出新异常是否会导致std::terminate被调用,并且设计的主要原因会丢失。结束一个没有任何好用途的功能。

我无法想象任何可以充分利用std::uncaught_exception的用例。并且出于最初的预期目的,只需确保您的析构函数为noexcept(true)(这是C ++ 11及更高版本中的默认值)并且不要抛出