在嵌套的';试试';? 是C++中定义的好的吗?我被迫将异常转换为返回代码(所用的API被许多C用户使用,所以我需要确保所有C++异常在控制返回给调用方之前被捕获和处理)。

在嵌套的';试试';? 是C++中定义的好的吗?我被迫将异常转换为返回代码(所用的API被许多C用户使用,所以我需要确保所有C++异常在控制返回给调用方之前被捕获和处理)。,c++,exception-handling,C++,Exception Handling,我希望样品能显示我的意图。我猜这是一种未定义的行为,但我不确定。如果适用,请提供本标准的报价。也欢迎其他方法 谢谢 没关系。异常在被捕获之前一直处于活动状态,此时它将变为非活动状态。但它会一直存在到处理程序的作用域结束。从标准来看,我的重点是: §15.1/4: 除了3.7.4.1中的说明外,正在抛出的异常的临时副本的内存是以未指定的方式分配的。只要存在针对该异常执行的处理程序,临时异常就会持续存在 即: catch(...) { // <-- /* ... */ } // &

我希望样品能显示我的意图。我猜这是一种未定义的行为,但我不确定。如果适用,请提供本标准的报价。也欢迎其他方法


谢谢

没关系。异常在被捕获之前一直处于活动状态,此时它将变为非活动状态。但它会一直存在到处理程序的作用域结束。从标准来看,我的重点是:

§15.1/4: 除了3.7.4.1中的说明外,正在抛出的异常的临时副本的内存是以未指定的方式分配的。只要存在针对该异常执行的处理程序,临时异常就会持续存在

即:

catch(...)
{ // <--

    /* ... */

} // <--
捕获(…)
{/因为在catch块中调用的
dispatcher
throw
将返回异常。如果您将在catch块外部调用
dispatcher
,则将调用
terminate()
(根据15.1/8)。在任何情况下都没有未定义的行为。

我记得考虑过这种方法以减少不同try/catch块产生的代码重复,但我实现了它。你为什么认为它可能是非法的?我以前也使用过这种方法,这是一个很好的解决方案technique@jdv-我觉得从try块中重新旋转有点不舒服在catch子句(甚至在不同的堆栈框架中)。它看起来有点太漂亮了,所以我想在安全的方面。在C++ 11中不使用参数的丢弃。我在C++ 3中使用这个方法没有问题,但是我在G++中遇到了一个麻烦的问题,试图将其移植(使用RePosixExtExchange和GETSUBER异常)。@agodinhost-Whoah-Whoah-Whoah-Whoah。你能引用那个来源吗?我想你可能会混淆异常规范!在构造函数中调用的方法中使用这种方法是可以的?(g++)
catch(...)
{ // <--

    /* ... */

} // <--