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
方法會被調用,輸出異常信息。這樣,我們就可以在協程中處理異常了。