正在从具有嵌套异常的catch块重新引发异常
Is rethrowing an exception from catch block which has an nested exception okay?
想法是"尝试you()
,如果失败,则尝试_do()
,如果失败则报告第一次尝试的异常,即you()
"。
void that_thing() {
try {
you();
} catch( ... ) {
bool error=false;
try {
_do();
} catch( ... ) {
error = true;
}
if( error ) throw;
}
}
用Gcc测试它工作得很好,我想知道它是否能与任何编译器一起工作。更清楚地说,我预期的奇怪行为是throw;
会重新抛出内部异常。
编辑:这个问题不是关于最内部的catch
,而是关于在捕获最内部之后重新抛出外部异常。问题是,在被指为类似的问题上,这种重新思考是否在法律上绝对没有被提及。
标准要求实现正确嵌套异常。引用标准:
15.1引发异常〔except.sthrow〕
8没有操作数的抛出表达式会重新引发当前处理的异常(15.3)。
15.3处理异常[除.handle]
7当catch子句的形式参数(如果有的话)初始化完成时,处理程序被认为是活动的。。。当catch子句退出时,或者当
std::unexpected()
在由于抛出而被输入后退出时,处理程序不再被视为活动的。8最近激活的处理程序仍处于活动状态的异常称为当前处理的异常。
当代码到达throw;
时,内部异常处理程序不再处于活动状态:catch子句已退出。外部异常处理程序仍然处于活动状态:它尚未退出,并且尚未调用std::unexpected()
。因此,实现必须支持这种用法,并重新抛出外部异常。全球";当前异常";在内部处理程序退出后被清除的指针将不符合C++标准的要求。
相关文章:
- 有没有更好的方法来处理异常? try-catch块真的很丑
- std::unique_ptr 在 try-catch 块中未捕获取消引用异常
- 如果一个对象是在本地创建的,并在C++中作为异常抛出,那么本地对象如何在其范围之外有效,即在 catch 块中?
- 构造函数中的异常:init() 方法、指针、大型 try/catch 或
- 指定特定异常以使用 catch 停止 GDB
- 无法使用 C++ catch(..) 捕获访问冲突异常
- 具有两个类似catch部分的代码的异常处理行为
- 基类catch不捕获异常,即使它出现在派生类catch之前
- 为什么当我抛出派生类的对象时,基类的 catch 块会捕获异常
- C++ 异常中的 catch(异常)是什么意思?
- 格式化文件异常被 try catch 块忽略
- 从catch块调用异常类中的函数并不是打印从try块传递的值
- 从用catch(..)捕获的异常中获取一些信息
- "try catch(...)"可以在 C++ 中捕获哪些异常?
- MFC TRY CATCH与C++对MFC异常的尝试捕获
- 使用try-Catch异常处理程序和if-else条件检查之间的区别
- catch站点中异常的常见用法是什么
- catch语句如何在没有反射的情况下识别异常类型
- 如何在这个try-show-catch代码中对异常进行排序
- llvm异常;Catch处理程序未处理,未调用清理