2013-11-14 54 views
3

我正在使用Boost exception_ptr的並注意到rethrow_exception(ptr)並沒有給我原來的例外。我已經煮熟它歸結爲這樣:Boost rethrow_exception拋出不同類型的異常

struct error : virtual std::exception, virtual boost::exception {}; 

try { 
    boost::exception_ptr ptr(boost::copy_exception(error())); 
    boost::rethrow_exception(ptr); 
} 
catch(boost::exception& e) { 
    // e is a boost::exception_detail::clone_impl<error> 
} 

不宜eerror代替clone_impl類型類型的?

我正在使用Boost 1.49.0。

回答

2

它是由設計。

請參閱http://www.boost.org/doc/libs/1_55_0/libs/exception/doc/frequently_asked_questions.html,「爲什麼boost :: exception abstract?」

boost :: exception的類型是抽象的,以防止用戶「重新拋出」它。如果用戶想重新推出,她被迫使用如下代碼:

catch(boost::exception & e) 
{ 
    e << foo_info(foo); 
    throw; //Okay, re-throwing the original exception object. 
} 

您也可以從不同的角度來看待這個問題。客戶錯誤類型幾乎可以是任何東西,它可能不允許從中派生出來,或者可能根本不可複製或不可構造(例如只能由朋友訪問的私人構造函數)。因此,Boost不能假設任何關於客戶類型的內容,不能從中複製或派生/複製,只能保留指向傳遞給boost::copy_exception的現有對象的指針。

相關問題