如果要在一段代码中忽略它们,我正在寻找一种编写带有异常代码的好方法。
考虑
bool ClearAllCaches() {
bool success = ClearPersistentCache();
success &= ClearTransientCache();
success &= ClearRemoteCache();
return success;
}
如果这些函数是在抛出而不是返回成功值,并且我还想重新抛出其中一个抛出的异常,但毕竟要完成之后,还有没有比这更干净的解决方案了?
void ClearAllCaches() {
MyException persistentException = MyException(ErrorCode::None);
try {
ClearPersistentCache();
} catch (const MyException& e) {
persistentException = e;
}
//...same for ClearTransientCache()
ClearRemoteCache(); // <- does not have to be caught.
if (persistentException.getCode() != ErrorCode::None) {
throw persistentException;
}
//...same for ClearTransientCache()
}
是否可以以可读且不太丑陋的方式编写此代码?
答案 0 :(得分:3)
使用lambda和std::exception_ptr
:
void ClearAllCaches() {
std::exception_ptr eptr;
auto CallAndStoreException = [&](auto func) {
try {
func();
} catch (...) {
eptr = std::current_exception();
}
};
CallAndStoreException(&ClearPersistentCache);
CallAndStoreException(&ClearTransientCache);
CallAndStoreException(&ClearRemoteCache);
if (eptr) {
std::rethrow_exception(eptr);
}
}
但是,如果您丢弃先丢弃的信息,您确定例外是正确的方法吗?如果您确定必须采用这种方式,也许还可以看看git repo