7

を使用する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)。それでも人々はブーストを使用します。私が見逃している動的アプローチの大きな利点はありますか? コード内のエラー情報をどのように文書化しますか?

4

3 に答える 3

1

非常に高いレベルから、その例外の診断情報を参照できます: http://www.boost.org/doc/libs/1_51_0/libs/exception/doc/diagnostic_information.html

これにより、例外が運ぶすべてのもの(およびもう少し)が出力されます。内部のものをすべて個別に取得する方法があるかどうかはわかりません...

例から:

example_io.cpp(70): Throw in function class boost::shared_ptr<struct _iobuf> __cdecl my_fopen(const char *,const char *)
Dynamic exception type: class boost::exception_detail::clone_impl<struct fopen_error>
std::exception::what: example_io error
[struct boost::errinfo_api_function_ *] = fopen
[struct boost::errinfo_errno_ *] = 2, "No such file or directory"
[struct boost::errinfo_file_name_ *] = tmp1.txt
[struct boost::errinfo_file_open_mode_ *] = rb
于 2014-06-28T20:10:01.720 に答える