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
を使用していないライブラリによってスローされていることです。この場合、可能な例外の種類ごとに1つずつキャッチすることを除いて、例外をexception_ptr
に入れ、それぞれにboost::copy_exception
を使用する方法はありますか?
私は実際にはboost例外をよく知っていませんが、型を保持しながら現在の例外を再びスローする 'catch'ブロックで単純な' throw; 'を試しましたか? – Asha
あなたはおそらく[スライス](http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c)の問題に苦しんでいるでしょう。 – enobayram