私はboost::exceptionがかなり好きですが、すぐに使える適切なwhat () 関数が提供されないことにかなり悩まされています。混乱しないでください。これには、仮説関数で見たいすべての情報を含む素晴らしいboost::diagnostic_informationがありますが、多重継承した場合に取得する関数から継承されないため(チュートリアルから示唆されているように) 、以下の行を参照) は、例外について何も説明しないベースからのデフォルトの役に立たないものです。what()
boost::exception
std::exception
what()
what()
std::exception
struct my_exception: virtual std::exception, virtual boost::exception { };
明らかに、オーバーライドwhat()
して戻そうとしましboost::diagnostic_information
たが、どういうわけかうまくいかないので、少し困惑しています。ループするためかもしれませんが、よくわかりません。
PS: 私が正しく実装したい理由what()
は、多くのツールでプログラムが停止した場合にデフォルトで表示されるからです (たとえば、gnu コンパイラは致命的なエラーを表示し、what()、ブースト ユニット テスト ツールなどを表示します)。 .)。
#include <boost/exception/all.hpp>
struct my_exception: virtual std::exception, virtual boost::exception {};
struct my_exception2: virtual std::exception, virtual boost::exception {
virtual const char* what() const throw() {
return "WHAT";
}
};
struct my_exception3: virtual std::exception, virtual boost::exception {
virtual const char* what() const throw() {
return boost::diagnostic_information(this).c_str();
}
};
int main() {
try {
BOOST_THROW_EXCEPTION(my_exception());
} catch (const std::exception& e){
std::cout << e.what() << std::endl;
//This is useless ___ std::exception
}
try {
BOOST_THROW_EXCEPTION(my_exception());
} catch (const boost::exception& e){
std::cout << boost::diagnostic_information(e) << std::endl;
//This is what I'd like to see ___ main.cpp(39): Throw in function int main() ___ Dynamic exception type: boost::exception_detail::clone_impl ___ std::exception::what: std::exception
}
try {
BOOST_THROW_EXCEPTION(my_exception2());
} catch (const std::exception& e){
std::cout << e.what() << std::endl;
//Overriding what usually works ___ WHAT
}
try {
BOOST_THROW_EXCEPTION(my_exception3());
} catch (const std::exception& e){
std::cout << e.what() << std::endl;
//But somehow here it does not work ___ Unknown exception.
}
}