C ++在循环中捕获异常,然后将_after_抛出循环结束?

时间:2018-12-09 11:36:40

标签: c++ c++11 exception-handling

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

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

这样做的最佳实践是什么?在我的特殊情况下,可以保存任何个例外。

我有两个想法:

  1. ex复制到一个ExceptionObj值。问题:当ex具有子类或需要处理更多异常时,伸缩性根本不好。

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

1 个答案:

答案 0 :(得分: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);

与异常对象的动态类型相关的所有生命周期问题都由标准库处理。您可以将ex视为对异常对象的引用计数句柄,从而可以将其从try-catch块中吊起。

这遵循您在帖子中提出的方法,然后在评论中确认,最后抛出的异常是被重新抛出的异常。