有没有办法在 boost::promise 已经设置时捕获从 boost::promise 抛出的异常?
Is there a way to catch the exception thrown from boost::promise when setting it while it's already set?
我有一个程序使用计时器在 GUI 应用程序中设置一些双缓冲区。在极少数情况下,例如,当程序正在关闭时,我收到一条错误消息,提示设置此缓冲区的承诺已设置。有没有办法捕获并处理该错误?
这是一个最小的例子:
#include <iostream>
#include <boost/thread/future.hpp>
int main()
{
boost::promise<int> promise;
try {
promise.set_value(0);
promise.set_value(0);
} catch (...) {
promise.set_exception(boost::current_exception());
}
return 0;
}
无论我如何尝试捕获它,它都会以错误终止我的程序:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::promise_already_satisfied> >'
而且 here 你可以看到它的实际效果。
在 set_value
之后另一个 set_value
失败,我敢打赌你的 catch 块中的 set_exception
失败的原因相同:结果(值或异常)已经设置,承诺已经满足。至少那是 std::promise
的工作方式,如果 boost::promise
工作相同,我不会感到惊讶。
我有一个程序使用计时器在 GUI 应用程序中设置一些双缓冲区。在极少数情况下,例如,当程序正在关闭时,我收到一条错误消息,提示设置此缓冲区的承诺已设置。有没有办法捕获并处理该错误?
这是一个最小的例子:
#include <iostream>
#include <boost/thread/future.hpp>
int main()
{
boost::promise<int> promise;
try {
promise.set_value(0);
promise.set_value(0);
} catch (...) {
promise.set_exception(boost::current_exception());
}
return 0;
}
无论我如何尝试捕获它,它都会以错误终止我的程序:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::promise_already_satisfied> >'
而且 here 你可以看到它的实际效果。
在 set_value
之后另一个 set_value
失败,我敢打赌你的 catch 块中的 set_exception
失败的原因相同:结果(值或异常)已经设置,承诺已经满足。至少那是 std::promise
的工作方式,如果 boost::promise
工作相同,我不会感到惊讶。