クラス固有例外
1 : class File { 2 : public: 3 : class exception : public std::exception { 4 : public: 5 : enum ID { 6 : UNKNOWN, 7 : FILE_MISSING, 8 : FILE_OPEN_FAILED, 9 : FILE_READ_FAILED, 10 : FILE_WRITE_FAILED, 11 : ID_MAX, 12 : }; 13 : static const char* ERRMSG[ ID_MAX ]; 14 : protected: 15 : ID m_ID; 16 : public: 17 : exception( ID id = UNKNOWN ) : std::exception(), m_ID( id ) {} 18 : virtual ~exception() {} 19 : const char* what() const { return ERRMSG[ m_ID ]; } 20 : }; 21 : 22 : File() { 23 : //...ごにょごにょ... 24 : throw exception( exception::FILE_MISSING ); 25 : } 26 : };
こんな感じで例外を使ってみる。ERRMSGの実体は.cpp側で。catch側はstd::exceptionを受け取って、e.whatを呼び出すだけ。本当はstd::runtime_errorのほうがいいのかもしれないけど、あれはコンストラクタの引数に文字列を取るため、今のところは却下。
個人的には、CreateとかLoadとかいう関数はvoidを返して、失敗時は例外を投げるというのがパターンになってて、boolを返すのは、Isなんちゃらみたいな関数のみ。たとえば、あるフォーマットのファイルからデータをいっぱい読むときは、tryでくくった中で読んで、catchでエラー報告をするという感じ。ただ、ファイルのどこでエラーが起きたかまで報告したいときは、ファイル内の要素ごとにtry, catchしないといけない。
ちなみに、やねさんが使っているらしいCodeToHTMLですが、うちの環境が.NETでないために使えなかったので、昔練習用に作ったperlスクリプトでソース吐いてみた。doxygenでの色づけは、CSSのクラスを使用していたようなので、はてなには不向きみたい。