C++20 引入了協程(coroutines),它們允許編寫更簡潔的異步代碼。在 C++ 中,協程使用 co_await
, co_yield
, 和 co_return
關鍵字來定義。處理協程中的異常與處理普通的 C++ 函數中的異常類似,但有一些不同之處。
當在協程中使用 co_await
時,可能會遇到 std::exception_ptr
類型的異常。這是因為協程可以拋出異常,而這些異常需要在協程完成或被銷毀時處理。為了處理這些異常,你需要使用 std::experimental::coroutine_traits
或 std::coroutine_traits<T>
的特化版本來定義異常類型。
以下是一個簡單的示例,展示了如何在 C++ 協程中處理異常:
#include <iostream>
#include <exception>
#include <coroutine>
#include <experimental/coroutine>
struct Task {
struct promise_type {
Task get_return_object() {
return {};
}
std::experimental::suspend_never initial_suspend() {
return {};
}
std::experimental::suspend_never final_suspend() noexcept {
return {};
}
void return_void() {}
void unhandled_exception() {
std::cout << "Unhandled exception in coroutine" << std::endl;
}
};
};
Task asyncTask() {
try {
co_await std::suspend_never{};
throw std::runtime_error("An error occurred in coroutine");
} catch (const std::exception& e) {
std::cout << "Caught exception: " << e.what() << std::endl;
}
}
int main() {
asyncTask();
return 0;
}
在這個示例中,我們定義了一個簡單的協程 asyncTask
,它在協程體內拋出一個異常。我們使用 try-catch
語句捕獲異常并處理它。注意,我們使用了 std::experimental::suspend_never
作為掛起類型,以便在協程體內立即拋出異常。在實際應用中,你可能需要根據你的需求選擇合適的掛起類型。