在匿名线程中声明异常,可以通过以下方法实现:
std::promise
和std::future
#include<iostream>
#include<thread>
#include <future>
#include<exception>
void someFunction() {
// 抛出异常
throw std::runtime_error("An error occurred");
}
int main() {
std::promise<void> p;
std::future<void> f = p.get_future();
std::thread t([&]() {
try {
someFunction();
p.set_value();
} catch (...) {
p.set_exception(std::current_exception());
}
});
try {
f.get();
} catch (const std::exception& e) {
std::cerr << "Caught exception: " << e.what()<< std::endl;
}
t.join();
return 0;
}
std::packaged_task
#include<iostream>
#include<thread>
#include <future>
#include<exception>
void someFunction() {
// 抛出异常
throw std::runtime_error("An error occurred");
}
int main() {
std::packaged_task<void()> task(someFunction);
std::future<void> f = task.get_future();
std::thread t(std::move(task));
try {
f.get();
} catch (const std::exception& e) {
std::cerr << "Caught exception: " << e.what()<< std::endl;
}
t.join();
return 0;
}
这两种方法都可以在匿名线程中捕获异常并在主线程中处理。std::promise
和std::future
方法更适用于需要在线程中执行多个任务的情况,而std::packaged_task
方法更适用于只需要在线程中执行一个任务的情况。
领取专属 10元无门槛券
手把手带您无忧上云