Почему я теряю информацию о типе при использовании boost :: copy_exception?
Когда я используюboost::copy_exception
скопировать исключение вexception_ptr
Я теряю информацию о типе. Посмотрите на следующий код:
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
, В этом случае, есть ли способ поместить исключение вexception_ptr
кроме перехвата каждого вида возможного исключения по одному и использованияboost::copy_exception
на каждом?