Por que perco informações de tipo ao usar boost :: copy_exception?
Quando eu usoboost::copy_exception
para copiar uma exceção para umexception_ptr
, Perco informações de tipo. Veja o seguinte código:
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;
}
}
A partir disso, recebo a seguinte saída:
N5boost16exception_detail10clone_implISt9exceptionEE
Dynamic exception type: boost::exception_detail::clone_impl<std::exception>
std::exception::what: N5boost16exception_detail10clone_implISt9exceptionEE
Então, basicamenteboost::copy_exception
copiou estaticamente o argumento recebid
Este problema será resolvido se eu lançar minha exceção comboost::enable_current_exception
em vez disso, assim.
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;
}
}
O problema é que, às vezes, as exceções são geradas por uma biblioteca que não usaboost::enable_current_exception
. Nesse caso, existe alguma maneira de colocar a exceção em umexception_ptr
além de capturar cada tipo de exceção possível, uma por uma, e useboost::copy_exception
em cada um?