c++++中可通过std::exception_ptr实现跨线程异常传递。1. 子线程捕获异常后使用std::current_exception()获取异常指针;2. 将该指针传递给主线程或其他线程;3. 目标线程通过std::rethrow_exception()重新抛出异常。例如子线程将异常存入std::promise对象,主线程调用get()方法时触发异常重抛,从而统一处理错误。实际应用中需注意指针有效性、资源清理及避免频繁跨线程抛异常,推荐结合std::future和std::promise进行异步异常处理。

在多线程编程中,跨线程传递异常是一个比较棘手的问题。因为线程之间是独立执行的,主线程无法直接感知到子线程中抛出的异常。C++标准库提供了 std::exception_ptr 和相关工具,可以实现跨线程的异常传递。下面我们就来看看具体怎么操作。

std::exception_ptr
std::exception_ptr 是 C++11 引入的一个类型,它用来持有(capture)一个异常对象的指针。你可以把它理解为一种“异常引用”,可以在当前线程捕获异常后,把异常信息保存下来,然后传递给另一个线程再重新抛出。

它的好处是:
立即学习“C++免费学习笔记(深入)”;
std::exception 的异常类型基本流程如下:

std::current_exception() 获取当前异常的 exception_ptr
exception_ptr 通过某种方式(比如成员变量、共享变量)传递给主线程或其他线程std::rethrow_exception() 重新抛出该异常举个简单的例子:
#include <iostream>
#include <thread>
#include <exception>
#include <stdexcept>
void thread_func(std::exception_ptr* err) {
try {
throw std::runtime_error("Something went wrong in thread!");
} catch (...) {
*err = std::current_exception(); // 捕获当前异常
}
}
int main() {
std::exception_ptr thread_ex;
std::thread t(thread_func, &thread_ex);
t.join();
if (thread_ex) {
std::rethrow_exception(thread_ex); // 主线程重新抛出
}
return 0;
}这样做的好处是:主线程能像正常流程一样处理子线程抛出的异常,而不是只能通过返回码或者日志去判断错误。
exception_ptr 传给其他线程使用,否则可能会访问无效内存。exception_ptr,统一收集后再判断哪个线程出错了。在实际项目中,推荐的做法包括:
std::future 和 std::promise 配合 set_exception 方法来传递异常,这样更符合现代 C++ 的异步编程风格exception_ptr
例如使用 std::promise 的方式:
std::promise<int> p;
std::thread([&p]() {
try {
throw std::runtime_error("error from thread");
} catch (...) {
p.set_exception(std::current_exception());
}
}).detach();
try {
p.get_future().get();
} catch (const std::exception& e) {
std::cout << "Caught exception: " << e.what() << std::endl;
}这种方式更清晰、安全,也更容易集成进异步任务调度中。
基本上就这些。掌握好 std::exception_ptr 和 std::rethrow_exception,再加上合适的同步机制,就能比较优雅地处理线程间的异常传递问题了。
以上就是如何跨线程传递C++异常 std exception ptr线程间异常传递的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号