【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