如何将kj::Promise<kj::Exception>转换为kj::Promise<void>?
KJ Promise 异常返回的类型转换问题解决方法
在返回kj::Promise的场景中,直接返回kj::Exception是合法的,示例如下:
kj::Promise<void> someFunc() { return KJ_EXCEPTION(FAILED, "some description"); }
但在then回调中返回KJ_EXCEPTION时,会生成kj::Promise<kj::Exception>类型的对象,无法直接转换为kj::Promise<void>,如下代码会触发编译器类型不匹配错误:
kj::Promise<void> someFunc(kj::Promise<void> somePromise) { return somePromise.then([]() { return KJ_EXCEPTION(FAILED, "some description"); }); }
解决方法
方法一:在回调中直接抛出异常
KJ的Promise机制会自动捕获回调中抛出的异常,并将其转化为Promise的失败状态,此时返回的Promise类型会自动匹配目标类型:
kj::Promise<void> someFunc(kj::Promise<void> somePromise) { return somePromise.then([]() { throw KJ_EXCEPTION(FAILED, "some description"); }); }
方法二:使用kj::fail()函数
kj::fail()会返回一个处于失败状态的Promise,其类型可以自动适配目标Promise类型,无需手动转换:
kj::Promise<void> someFunc(kj::Promise<void> somePromise) { return somePromise.then([]() { return kj::fail(KJ_EXCEPTION(FAILED, "some description")); }); }
方法三:转换已有的kj::Promise<kj::Exception>
如果已经持有一个kj::Promise<kj::Exception>对象,可以通过then回调抛出异常,将其转换为目标类型的失败Promise:
kj::Promise<void> convertToFailedVoidPromise(kj::Promise<kj::Exception> exceptionPromise) { return exceptionPromise.then([](kj::Exception e) { throw e; }); }
内容的提问来源于stack exchange,提问作者JonasVautherin
相关产品推荐
相关产品推荐

