2011-07-18 19 views
6

Boost vadeli işlemlerini kullanırsam ve gelecekteki raporlar has_exception() öğesi için geçerliyse, bu özel durumu geri almanın herhangi bir yolu var mı?İstisna bildirme istisnası nasıl alınır?

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

soru "?????" yerine konmalıdır ne olduğunu: Örneğin, burada şu kod nedir?

+0

Dokümanlar has_exception' 'söylemek:' gerçek bu uyumsuz bir sonuçla ilişkili * ise, bu sonuç alma için hazır olduğunu ve sonuç depolanmış bir istisnadır. Ama bu müthiş dokümantasyon, nasıl yapılacağını söylemez .... – CharlesB

+0

sadece 'fi.get() 'yi denediniz mi? – Nim

cevap

7

http://groups.google.com/group/boost-list/browse_thread/thread/1340bf8190eec9d9?fwc=2 göre, bunun yerine yapmanız gerekir:

#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

Teşekkürler. Bu arada cevabı buldum, kaynak koduna baktım. Aslında, belgede yeterince iyi gizlenmiş bir şekilde yazıldığını buldum. – petersohn