を使用するboost::exception
場合、例外が運ぶデータを知るための推奨される方法は何ですか? ブーストのドキュメントでは、次の例が示されています。
catch( io_error & e )
{
std::cerr << "I/O Error!\n";
if( std::string const * fn=get_error_info<file_name>(e) )
std::cerr << "File name: " << *fn << "\n";
if( int const * c=get_error_info<errno_code>(e) )
std::cerr << "OS says: " << strerror(*c) << "\n";
}
これは、特に例外が多くのレイヤーを通過し、理論的に利用可能なメタデータが大量にある場合は、少し扱いにくいようです。したがって、例外クラスごとに考えられるエラー情報を文書化することは理にかなっていると思います。次に、例外に含まれる可能性のある情報について、いくつかの機能のドキュメントも必要になるでしょう。結局、次の構造体のようなものを使用した場合と同じように、ドキュメントでもまったく同じ構造になっているように感じます。
struct FileException {
string* filename; // NULL or string
}
次に、catch ブロックでこの情報を変更できます。
catch (FileException& e) {
e.filename = filename;
throw;
}
この簡単な方法で、ほとんどのドキュメントを回避し、すべての安全性から利益を得ることができます (たとえば、 からファイル名を取得しようとしないなどMathException
)。それでも人々はブーストを使用します。私が見逃している動的アプローチの大きな利点はありますか? コード内のエラー情報をどのように文書化しますか?