是否有一种模式可以相互执行多个抛出函数?

时间:2018-10-31 09:57:06

标签: c++ exception-handling

如果要在一段代码中忽略它们,我正在寻找一种编写带有异常代码的好方法。

考虑

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()
}

是否可以以可读且不太丑陋的方式编写此代码?

1 个答案:

答案 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