我遇到了this文章并说明了(为方便起见,复制粘贴)。我不明白它以及它如何比通常的异常处理更有益。在do_work
代码中,error
实例作为对新创建的线程的引用传递。现在如果有错误则重新抛出。之后发生了什么?以下方法有什么作用?
error = boost::exception_ptr();
error = boost::current_exception();
这是来自链接
使用提升异常的另一个好处是线程安全 能力。它允许在线程之间进行异常 没有问题。
例如,这个抛出克隆就绪异常的函数:
void do_work() { boost::exception_ptr error; boost::thread t( boost::bind(worker_thread,boost::ref(error)) ); t.join(); if( error ) boost::rethrow_exception(error); }
可以被截获并克隆为由其他线程携带 安全地,例如:
#include <boost/exception_ptr.hpp> #include <boost/thread.hpp> #include <boost/bind.hpp> void do_work(); //throws cloning-enabled boost::exceptions void worker_thread( boost::exception_ptr & error ) { try { do_work(); error = boost::exception_ptr(); } catch(...) { error = boost::current_exception(); } }
答案 0 :(得分:4)
boost::exception_ptr()
将默认构造一个异常指针,类似于空指针,这意味着在if-check中它将评估为false,表示没有错误。
boost::current_exception()
返回一个异常指针,指向catch子句中的当前活动异常。它基本上捕获异常,以便您可以在if检查中重新抛出它。
作为避免所有这些样板代码的替代方案,我建议使用std::async/boost::async
提供所有开箱即用的功能。
我不确定你的意思&#34;正常&#34;异常处理,但这允许你处理呼叫方面的错误,表明你的线程没有完成它应该做的工作。