C++20 引入了协程支持,使得处理协程异常变得更加简单。在 C++20 中,协程异常是通过 std::coroutine_handle<>
和 std::stop_token
处理的。下面是一个简单的示例,展示了如何在协程中处理异常:
#include#include #include // 定义一个简单的协程类型 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
方法会被调用,输出异常信息。这样,我们就可以在协程中处理异常了。