質問: C/C++でやっています。 C/C++で例外処理ってありますよね。 今までは int型で投げていたのですが、std::exception を継承すればより簡単にできるようなので それに切り替えようかと思っています。 ここまではいいのですが、試しにやってみたところ、 なぜかエラー... 普通のエラーは読めて、ある程度パターンから推測 & 修正できますが、STL関連なので... ``` #include #include #include namespace EXCEPTION{ // 例外用クラス class MyException : public std::exception{ public: MyException( const std::string &str ) : std::exception(str){} ~MyException(){} }; // 例外を投げる関数 void ThrowException( void ) throw(MyException){ throw MyException( "DLLがない...の?" ); // 今回は"例外用クラス"に関してなので 確実に投げる。 } // 実際に例外を受け取る関数 void Check( void ){ try{ ThrowException(); }catch( MyException &e ){ cout << e.what() << endl; } return; } } int main( void ){ EXCEPTION::func(); return 0; } ``` としました。 ですがコンパイルしようとすると ``` (ファイル名): In constructor 'EXCEPTION::MyException::MyException(const string&)': (ファイル名):(行番号):(列数?): error: no matching function for call to 'std::exception::exception(const string&)' MyException( const std::string &str ) : std::exception(str){} ``` と出てコンパイルできません。 何がいけないのでしょうか? std::exceptionはpublicで継承しているし、上記でいう、MyExcepitonクラスのコンストラクタから親クラスに 引数を渡しているはずなのに... 普通に ``` #include #include #include namespace EXCEPTION{ class MyException : public std::exception{ public: MyException( const std::string &str ) : m_error(str){} ~MyException(){}; const char* what( void ){ return m_error.c_str(); } private: std::string m_error; }; ... // 以下省略 } ``` とすれば普通に動きますが、継承の意味があまりない... ( せいぜい、親クラスである std::exception で受け取れるぐらい ) それだったら独自のクラスとして定義すればいいと思うし... 何がいけないのでしょうか。 もしかすると私のスペルミスとかかもしれないし... と考えてチェックしてみましたが、 私からすると「間違っていない」。 どうすればいいでしょうか。 Boostにも boost::exception があるようですが、 できれば C++ の範囲のみ ( C++で提供されているもの ) で出来たらいいのですが... [情報] 言語 : C/C++ コンパイラ : MinGW 知りたいこと: C++でのstd::exceptionを継承した独自の例外クラス定義方法 宜しくお願い致します。
回答: `std::exception`クラスは、`const std::string&`を受け取るコンストラクタを持っていないですね。 ``ヘッダで定義される`std::runtime_error`クラスとかは持っていますが。 例外クラスを設計する際は、最初に``で定義されるクラスのいずれかの分類の下に属することができるかを検討したほうが、作るのが楽になりますね。それに属しないなら`std::exception`から派生して、自分でエラー文字列を管理することになります。