クラス固有例外

   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のクラスを使用していたようなので、はてなには不向きみたい。