温馨提示×

c++ coroutine如何处理协程异常

c++
小樊
83
2024-11-23 11:33:20
栏目: 编程语言

C++20 引入了协程支持,使得处理协程异常变得更加简单。在 C++20 中,协程异常是通过 std::coroutine_handle<>std::stop_token 处理的。下面是一个简单的示例,展示了如何在协程中处理异常:

#include <iostream>
#include <coroutine>
#include <stdexcept>

// 定义一个简单的协程类型
struct Task {
    struct promise_type {
        Task get_return_object() {
            return {};
        }

        std::suspend_never initial_suspend() {
            return {};
        }

        std::suspend_never final_suspend() noexcept {
            return {};
        }

        void return_void() {}

        void unhandled_exception() {
            std::cerr << "Unhandled exception in coroutine" << std::endl;
        }
    };
};

// 定义一个协程函数,用于抛出异常
Task async_throw() {
    throw std::runtime_error("An error occurred in coroutine");
}

int main() {
    try {
        async_throw();
    } catch (const std::exception& e) {
        std::cout << "Caught exception: " << e.what() << std::endl;
    }

    return 0;
}

在这个示例中,我们定义了一个简单的协程类型 Task,它有一个 promise_type,用于处理协程的挂起、恢复和返回。在 promise_type 中,我们重写了 unhandled_exception 方法,用于处理未捕获的异常。当协程抛出异常时,unhandled_exception 方法会被调用,输出异常信息。

main 函数中,我们调用 async_throw 协程函数,并使用 try-catch 语句捕获异常。如果协程抛出异常,unhandled_exception 方法会被调用,输出异常信息。这样,我们就可以在协程中处理异常了。

0