2011-07-18 1 views
6

Si j'utilise des contrats à terme Boost, et que les futurs rapports sont vrais avec has_exception(), y a-t-il un moyen de récupérer cette exception? Par exemple, voici le code suivant:Comment faire pour que l'exception soit signalée à boost :: future?

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(?????); 
} 
... 

La question est, qu'est-ce qui devrait être mis à la place de "?????"?

+0

Docs disent pour 'has_exception':' vrai si * ceci est associé à un résultat asynchrone, ce résultat est prêt pour la récupération, et le résultat est une exception stockée ». Mais cette grande partie de la documentation ne dit pas comment l'obtenir .... – CharlesB

+0

avez-vous essayé simplement 'fi.get()'? – Nim

Répondre

7

Selon http://groups.google.com/group/boost-list/browse_thread/thread/1340bf8190eec9d9?fwc=2, vous devez faire ceci:

#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

Merci. Pendant ce temps, j'ai trouvé la réponse, en regardant le code source. En fait, je l'ai trouvé écrit dans la documentation, d'une manière suffisamment bien cachée. – petersohn

Questions connexes