當我使用boost::copy_exception
將例外複製到exception_ptr
時,我丟失了類型信息。看看下面的代碼:爲什麼使用boost :: copy_exception時會丟失類型信息?
try {
throw std::runtime_error("something");
} catch (exception& e) {
ptr = boost::copy_exception(e);
}
if (ptr) {
try {
boost::rethrow_exception(ptr);
} catch (std::exception& e) {
cout << e.what() << endl;
cout << boost::diagnostic_information(e) << endl;
}
}
由此,我得到下面的輸出:
N5boost16exception_detail10clone_implISt9exceptionEE
Dynamic exception type: boost::exception_detail::clone_impl<std::exception>
std::exception::what: N5boost16exception_detail10clone_implISt9exceptionEE
所以基本上boost::copy_exception
靜態複製它得到了論證。
如果我用boost::enable_current_exception
來代替這個問題,這個問題就解決了。
try {
throw boost::enable_current_exception(std::runtime_error("something"));
} catch (...) {
ptr = boost::current_exception();
}
if (ptr) {
try {
boost::rethrow_exception(ptr);
} catch (std::exception& e) {
cout << e.what() << endl;
cout << boost::diagnostic_information(e) << endl;
}
}
問題在於,有時例外情況是由不使用boost::enable_current_exception
的庫引發的。在這種情況下,除了逐一捕捉每種可能的例外情況並在每一種情況下使用boost::copy_exception
之外,是否有任何方法可將異常置入exception_ptr
?
我不是很熟悉boost異常,但是你在'catch'塊中嘗試了一個簡單的'throw;',它在拋出當前異常的同時又保留了它的類型嗎? – Asha 2012-04-02 09:04:03
你可能正在遭受[切片](http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c)問題。 – enobayram 2012-04-02 09:07:57