2011-07-18 11 views
6

Jeśli używam kontraktów typu Boost, a przyszłe raporty są zgodne z has_exception(), czy istnieje sposób na odzyskanie tego wyjątku? Na przykład poniższy kod:Jak uzyskać zgłoszenie wyjątku do zwiększenia :: przyszłość?

int do_something() { 
    ... 
    throw some_exception(); 
    ... 
} 

... 

boost::packaged_task task(do_something); 
boost::unique_future<int> fi=task.get_future(); 
boost::thread thread(boost::move(task)); 
fi.wait(); 
if (fi.has_exception()) { 
    boost::rethrow_exception(?????); 
} 
... 

Pytanie brzmi, co należy umieścić w miejscu "?????"?

+0

Docs powiedzieć 'has_exception':' * true, jeśli wiąże się to z asynchronicznego rezultacie, że wynik jest gotowy do pobierania, a wynik jest przechowywanym wyjątkiem ". Ale ta świetna dokumentacja nie mówi, jak ją zdobyć ... – CharlesB

+0

Czy próbowałeś po prostu 'fi.get()'? – Nim

Odpowiedz

7

Według http://groups.google.com/group/boost-list/browse_thread/thread/1340bf8190eec9d9?fwc=2, trzeba to zrobić w zamian:

#include <boost/throw_exception.hpp> 

int do_something() { 
    ... 
    BOOST_THROW_EXCEPTION(some_exception()); 
    ... 
} 

... 
try 
{ 
    boost::packaged_task task(do_something); 
    boost::unique_future<int> fi=task.get_future(); 
    boost::thread thread(boost::move(task)); 
    int answer = fi.get(); 
} 
catch(const some_exception&) 
{ cout<< "caught some_exception" << endl;} 
catch(const std::exception& err) 
{/*....*/} 
... 
+0

Dziękuję. Tymczasem znalazłem odpowiedź, patrząc na kod źródłowy. Właściwie to znalazłem to napisane w dokumentacji, w wystarczająco dobrze ukryty sposób. – petersohn

Powiązane problemy