C++在循环中捕获异常并重新抛出_after_循环结束?

mis*_*sev 6 c++ exception-handling c++11

目标是完全处理循环并抛出之后可能发生的任何异常:

for (...) {
   try {
      // code that could throw
   } catch (const ExceptionObj &ex) {
      // save ex and rethrow after the loop
   }
}
Run Code Online (Sandbox Code Playgroud)

这样做的最佳做法是什么?在我的特定情况下,保存任何异常都是可以的.

我有几个想法:

  1. 复制ex到一个ExceptionObj值.问题:当ex有子类或需要处理更多异常时,根本不能很好地扩展.

  2. 有一个clone方法,ExceptionObj在堆上返回一个副本.问题:不适用于第三方例外.

Sto*_*ica 7

以这种类型擦除的方式处理抛出的异常对象是std::exception_ptr存在的:

std::exception_ptr ex;
for (...) {
   try {
      // code that could throw
   } catch (...) {
      ex = std::current_exception();
   }
}
if(ex) // Only evaluates to true if a thrown exception was assigned to it.
    std::rethrow_exception(ex);
Run Code Online (Sandbox Code Playgroud)

与异常对象的动态类型相关的所有生命周期问题都由标准库处理.您可以将其ex视为异常对象的引用计数句柄,允许您将其提升到try-catch块之外.

这遵循您在帖子中列出的方法,然后在评论中确认,抛出的最后一个异常是重新抛出的异常.

  • 一些挑剔:取决于实现(和条件),您最终可能会:1.重新抛出std :: bad_alloc(或std :: bad_exception)而不是用户异常; 2.未指定的行为,如果没有内存可以在可以抛出它(另一个对象)的各个点处分配另一个异常对象.当然,所有这些只有在堆(几乎)耗尽时才会发生.另外,你最终可以保证调用异常cctor ...如果它总是抛出其他东西 - 你将永远无法重新抛出你的原始异常. (2认同)