似乎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
}
答案 0 :(得分:0)
是否存在差异,无关紧要。导致创建该功能的前提本身就存在缺陷,而且基本上没用。
该函数是一个测试,用于确定在执行此代码(析构函数或从析构函数调用的代码)时是否存在异常,这将指示堆栈正在展开并且第二个异常将终止该计划。
除了赢了之外。两个异常不能在同一堆栈帧中激活,但在飞行中可能有多个异常。抛出异常,堆栈开始展开,本地对象的一个析构函数最终调用在内部 try
块时抛出异常的代码。完全合法和精细,两个例外在飞行中同时展开堆栈的不同部分。
因此,函数std::uncaught_exception
不能用于确定抛出新异常是否会导致std::terminate
被调用,并且设计的主要原因会丢失。结束一个没有任何好用途的功能。
我无法想象任何可以充分利用std::uncaught_exception
的用例。并且出于最初的预期目的,只需确保您的析构函数为noexcept(true)
(这是C ++ 11及更高版本中的默认值)并且不要抛出