C++在循环中捕获异常并重新抛出_after_循环是否完成



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

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块中提升出来。

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

最新更新