Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从包含嵌套异常的catch块中重试异常是否可以?_C++_Exception Handling - Fatal编程技术网

C++ 从包含嵌套异常的catch块中重试异常是否可以?

C++ 从包含嵌套异常的catch块中重试异常是否可以?,c++,exception-handling,C++,Exception Handling,我们的想法是尝试你,如果失败就尝试,如果失败就报告第一次尝试的异常,即你 使用Gcc测试它工作得很好,我想知道它是否可以与任何编译器一起工作。更清楚地说,我所期待的奇怪行为是投掷;将重新显示内部异常 编辑:这个问题不是关于最内部的捕获,而是关于在捕获最内部的捕获后重新引用外部异常。问题是,在法律上,这种重新引用是否明确没有在被指出为类似的问题上进行过。该标准要求实现正确地嵌套异常。引用标准: 15.1引发异常[除了.throw] 8没有操作数的抛出表达式将返回当前处理的异常15.3 15.3处

我们的想法是尝试你,如果失败就尝试,如果失败就报告第一次尝试的异常,即你

使用Gcc测试它工作得很好,我想知道它是否可以与任何编译器一起工作。更清楚地说,我所期待的奇怪行为是投掷;将重新显示内部异常


编辑:这个问题不是关于最内部的捕获,而是关于在捕获最内部的捕获后重新引用外部异常。问题是,在法律上,这种重新引用是否明确没有在被指出为类似的问题上进行过。

该标准要求实现正确地嵌套异常。引用标准:

15.1引发异常[除了.throw]

8没有操作数的抛出表达式将返回当前处理的异常15.3

15.3处理异常[除.handle外]

7当形式参数的初始化完成时,如果catch子句中的任何一个。。。当catch子句退出或由于抛出而输入std::unexpective后退出时,处理程序不再被认为是活动的

8最近激活的处理程序仍处于活动状态的异常称为当前处理的异常


当代码到达抛出位置时;,内部异常处理程序不再处于活动状态:catch子句已退出。外部异常处理程序仍处于活动状态:它尚未退出,并且尚未调用std::unexpected。因此,实现必须支持这种用法,并重新抛出外部异常。在内部处理程序退出后被清除的全局当前异常指针将不符合C++标准的要求。

< P>标准要求实现正确地嵌套异常。引用标准:

15.1引发异常[除了.throw]

8没有操作数的抛出表达式将返回当前处理的异常15.3

15.3处理异常[除.handle外]

7当形式参数的初始化完成时,如果catch子句中的任何一个。。。当catch子句退出或由于抛出而输入std::unexpective后退出时,处理程序不再被认为是活动的

8最近激活的处理程序仍处于活动状态的异常称为当前处理的异常


当代码到达抛出位置时;,内部异常处理程序不再处于活动状态:catch子句已退出。外部异常处理程序仍处于活动状态:它尚未退出,并且尚未调用std::unexpected。因此,实现必须支持这种用法,并重新抛出外部异常。在内部处理程序退出之后被清除的全局当前异常指针将不符合C++标准的要求。

另一个类似的问题:同意它看起来不像是被关闭的一种折叠,但我不确定是什么促使了这个问题。我想说,它当然不会重新抛出内部异常。考虑一个简单的尝试{Fo};} catch…{bar;抛出;}。我从未见过有人担心当bar内部抛出并捕获异常时会发生什么。您是否可以进一步解释一下您认为内部异常可能会被重新抛出的原因?一个更具体的问题可以得到更好的答案。在没有咨询标准或对这个问题有任何专门知识的情况下,我会冒昧地猜测,这很好,编译器必须跟踪最外层的异常。否则,如果_do在幕后使用try/catch本身,并且它只是吞下了异常,然后它被内联或甚至没有内联,那么代码就会发生不好的事情。@hvd我在想,如果你有一个简单的异常机制,它使用一个全局指针指向当前异常,那么在第二次捕获时就会替换当前异常,因此在rethrow指令中给出了不希望出现的行为。@AndréPuel啊,好的。是的,它不是那样工作的。我会检查是否能找到一个很好的参考答案。另一个类似的问题:我同意它看起来不像是被关闭的东西的复制品,但我不确定是什么引发了这个问题。我想说,它当然不会重新抛出内部异常。考虑一个简单的尝试{Fo};} catch…{bar;抛出;}。我从未见过有人担心当bar内部抛出并捕获异常时会发生什么。您是否可以进一步解释一下您认为内部异常可能会被重新抛出的原因?一个更具体的问题可以得到更好的答案。在没有咨询标准或对这个问题有任何专门知识的情况下,我会冒昧地猜测,这很好,编译器必须跟踪最外层的异常。否则,如果你在幕后使用try/catch本身,并且它只是吞下了异常,它被内联或者甚至没有内联,那么糟糕的事情就会发生在你身上
ur代码。@hvd我在想,如果你有一个简单的异常机制,它使用一个指向当前异常的全局指针,这个当前异常将在第二次捕获时被替换,从而在rethrow指令中给出不需要的行为。@AndréPuel啊,好的。是的,它不是那样工作的。我会查一查,看能不能找到一个好的参考答案。
void that_thing() {
    try {
        you();
    } catch( ... ) {
        bool error=false;
        try {
            _do();
        } catch( ... ) {
            error = true;
        }
        if( error ) throw;
    }
}