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
方法会被调用,输出异常信息。这样,我们就可以在协程中处理异常了。