【C++】カスタム例外と継承
カスタム例外を作りたくなりました。
さらにカスタム例外クラスを継承したくなりました。
なので試してみようと思います。
今日のお話
開発言語
やりたいこと
- 例外クラスのインスタンスを作る時にメッセージを設定できるようにしたい
- ↓みたいな階層構造にしたいと思いました。
exception:標準例外クラス
┗BaseException:カスタム例外クラス(親クラス)
┗SubException:カスタム例外クラス(子クラス)
サンプルソース
#include <iostream> using namespace std; // カスタム例外クラス(親クラス) class BaseException : public exception { public: BaseException(const string &msg) { message = msg; } char const *what() const noexcept { return message.c_str(); } private: string message; }; // カスタム例外クラス(子クラス) class SubException : public BaseException { public: SubException(string msg) : BaseException(msg) {} }; // サンプル関数 void SampleFunc() { try { throw SubException("aaa"); } catch (SubException subex) { cout << subex.what() << endl; throw; //ここで再スロー } } // メイン関数 int main() { try { SampleFunc(); } catch (BaseException bex) // SubExceptionも受け取れる { cout << bex.what() << endl; } return 0; }
気付き
- exceptionクラスはデフォルトではコンストラクタにメッセージを追加することができないみたいです。*1
SubException
のスローするとBaseException
でもキャッチすることができますね。(当たり前ですがw)- これで
SubException
に詳細エラーを書いて、BaseException
でもう少し全体的なエラーにすることができます。
戯言
exception
クラスにはデフォルトでメッセージを登録するようなことはできないみたいです。- 例外も階層化すればエラーがあった時にトレースが便利になると思うから、設計の時とかに意識して使っていけるようにしたいな。
*1:例外クラスとstd::exception:https://teratail.com/questions/79022