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

标签 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. ExceptionObj 中有一个clone 方法,它返回堆上的拷贝。问题:不适用于第三方异常。

最佳答案

以这种类型删除的方式处理抛出的异常对象是什么 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 block 之外。

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

关于C++ 在循环中捕获异常并在循环结束后重新抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53691916/

相关文章:

c++ - Visual C++ 2013 可以做 Purify 和 Quantify 所做的事情吗?

c++ - 相交功能

c++ - 如何通过 decltype 声明迭代器的值

c++ - 从 catch(...) 捕获的异常中获取一些信息?

spring - @RestControllerAdvice 中许多项目的 basePacakage

c++ - 局部函数声明有什么用吗?

c++ - 什么正式保证非原子变量不能看到凭空存在的值并创建像原子松弛理论上可以的数据竞争?

c++11 - 错误 : <atomic> is not implemented in LLVM version 5. 1

c++ - 如何立即运行 lambda?

.net - 除了解析 .message 属性之外,是否有可靠的方法来识别由锁定文件引起的 IOexceptions?