【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