C++ 在循环中捕获异常并在循环结束后重新抛出?
C++ catch exception in a loop and rethrow _after_ the loop finishes?
目标是完全处理一个循环并抛出之后可能发生的任何异常:
for (...) {
try {
// code that could throw
} catch (const ExceptionObj &ex) {
// save ex and rethrow after the loop
}
}
执行此操作的最佳做法是什么?在我的特殊情况下,保存 任何 的异常都可以。
我有几个想法:
将 ex
复制到 ExceptionObj
值。问题:当 ex 有子类或需要处理更多异常时,根本无法很好地扩展。
在ExceptionObj
中有一个clone
方法,即returns堆上的一个副本。问题:不适用于第三方异常。
以这种类型擦除的方式处理抛出的异常对象是 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 块之外。
这遵循您在 post 中提出的方法,然后在评论中确认,最后抛出的异常将被重新抛出。
目标是完全处理一个循环并抛出之后可能发生的任何异常:
for (...) {
try {
// code that could throw
} catch (const ExceptionObj &ex) {
// save ex and rethrow after the loop
}
}
执行此操作的最佳做法是什么?在我的特殊情况下,保存 任何 的异常都可以。
我有几个想法:
将
ex
复制到ExceptionObj
值。问题:当 ex 有子类或需要处理更多异常时,根本无法很好地扩展。在
ExceptionObj
中有一个clone
方法,即returns堆上的一个副本。问题:不适用于第三方异常。
以这种类型擦除的方式处理抛出的异常对象是 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 块之外。
这遵循您在 post 中提出的方法,然后在评论中确认,最后抛出的异常将被重新抛出。