From e6d880e511db7f12bda1f8ee599246d30b7ebf1b Mon Sep 17 00:00:00 2001 From: Sona Kurazyan Date: Fri, 17 Apr 2020 12:28:21 +0200 Subject: [PATCH] Move larger code examples in QFuture docs into snippets Change-Id: I77b943124ac9c82f54b0c38e9437b9415604c21a Reviewed-by: Karsten Heimrich Reviewed-by: Vitaly Fanaskov --- .../code/src_corelib_thread_qfuture.cpp | 76 ++++++++++++++++++ src/corelib/thread/qfuture.qdoc | 77 ++----------------- 2 files changed, 81 insertions(+), 72 deletions(-) diff --git a/src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp index 4fe3f7e99e..66fa62f6b3 100644 --- a/src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp +++ b/src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp @@ -99,3 +99,79 @@ if (auto filePath = std::get_if(&result)) { else // process the error //! [4] + +//! [5] +QFuture future = ...; + future.then([](QFuture f) { + try { + ... + auto result = f.result(); + ... + } catch (QException &e) { + // handle the exception + } + }).then(...); +//! [5] + +//! [6] +QFuture parentFuture = ...; +auto continuation = parentFuture.then([](int res1){ ... }).then([](int res2){ ... })... +... +// parentFuture throws an exception +try { + auto result = continuation.result(); +} catch (QException &e) { + // handle the exception +} +//! [6] + +//! [7] +QFuture future = ...; +auto resultFuture = future.then([](int res) { + ... + throw Error(); + ... +}).onFailed([](const Error &e) { + // Handle exceptions of type Error + ... + return -1; +}).onFailed([] { + // Handle all other types of errors + ... + return -1; +}); + +auto result = resultFuture.result(); // result is -1 +//! [7] + +//! [8] +QFuture future = ...; +future.then([](int res) { + ... + throw std::runtime_error("message"); + ... +}).onFailed([](const std::exception &e) { + // This handler will be invoked +}).onFailed([](const std::runtime_error &e) { + // This handler won't be invoked, because of the handler above. +}); +//! [8] + +//! [9] +QFuture future = ...; +auto resultFuture = future.then([](int res) { + ... + throw Error("message"); + ... +}).onFailed([](const std::exception &e) { + // Won't be invoked +}).onFailed([](const QException &e) { + // Won't be invoked +}); + +try { + auto result = resultFuture.result(); +} catch(...) { + // Handle the exception +} +//! [9] diff --git a/src/corelib/thread/qfuture.qdoc b/src/corelib/thread/qfuture.qdoc index fc2892ad2d..6fb7ab032a 100644 --- a/src/corelib/thread/qfuture.qdoc +++ b/src/corelib/thread/qfuture.qdoc @@ -835,34 +835,13 @@ the exception of the previous future inside the continuation, to not interrupt the chain of multiple continuations. For example: - \code - QFuture future = ...; - future.then([](QFuture f) { - try { - ... - auto result = f.result(); - ... - } catch (QException &e) { - // handle the exception - } - }).then(...); - \endcode + \snippet code/src_corelib_thread_qfuture.cpp 5 If the previous future throws an exception and it is not handled inside the continuation, the exception will be propagated to the continuation future, to allow the caller to handle it: - \code - QFuture parentFuture = ...; - auto continuation = parentFuture.then([](int res1){ ... }).then([](int res2){ ... })... - ... - // parentFuture throws an exception - try { - auto result = continuation.result(); - } catch (QException &e) { - // handle the exception - } - \endcode + \snippet code/src_corelib_thread_qfuture.cpp 6 In this case the whole chain of continuations will be interrupted. @@ -931,63 +910,17 @@ For example: - \code - QFuture future = ...; - auto resultFuture = future.then([](int res) { - ... - throw Error(); - ... - }).onFailed([](const Error &e) { - // Handle exceptions of type Error - ... - return -1; - }).onFailed([] { - // Handle all other types of errors - ... - return -1; - }); - - auto result = resultFuture.result(); // result is -1 - - \endcode + \snippet code/src_corelib_thread_qfuture.cpp 7 If there are multiple handlers attached, the first handler that matches with the thrown exception type will be invoked. For example: - \code - QFuture future = ...; - future.then([](int res) { - ... - throw std::runtime_error("message"); - ... - }).onFailed([](const std::exception &e) { - // This handler will be invoked - }).onFailed([](const std::runtime_error &e) { - // This handler won't be invoked, because of the handler above. - }); - \endcode + \snippet code/src_corelib_thread_qfuture.cpp 8 If none of the handlers matches with the thrown exception type, the exception will be propagated to the resulted future: - \code - QFuture future = ...; - auto resultFuture = future.then([](int res) { - ... - throw Error("message"); - ... - }).onFailed([](const std::exception &e) { - // Won't be invoked - }).onFailed([](const QException &e) { - // Won't be invoked - }); - - try { - auto result = resultFuture.result(); - } catch(...) { - // Handle the exception - } - \endcode + \snippet code/src_corelib_thread_qfuture.cpp 9 \note You can always attach a handler taking no argument, to handle all exception types and avoid writing the try-catch block.