目标是完全处理循环并抛出随后可能发生的任何异常:
for (...) {
try {
// code that could throw
} catch (const ExceptionObj &ex) {
// save ex and rethrow after the loop
}
}
这样做的最佳实践是什么?在我的特殊情况下,可以保存任何个例外。
我有两个想法:
将ex
复制到一个ExceptionObj
值。问题:当ex具有子类或需要处理更多异常时,伸缩性根本不好。
在clone
中有一个ExceptionObj
方法,该方法返回堆上的副本。问题:不适用于第三方例外。
答案 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块中吊起。
这遵循您在帖子中提出的方法,然后在评论中确认,最后抛出的异常是被重新抛出的异常。