2018年01月16日
《その239》 論理エラークラス
論理エラークラス
論理エラーは、論理的な誤りに対するエラーで、プログラムの実行前に検出が可能であり、本来は、事前に回避されるべきエラーです。
論理エラークラスには、
logic_errorクラス
と、このクラスから public派生した
(1) domain_errorクラス
(2) invalid_argumentクラス
(3) length_errorクラス
(4) out_of_rangeクラス
があります。
logic_errorクラス
logic_errorクラスは、exceptionクラスから直接派生したクラスです。
このクラスは、プログラム実行前に検出可能な論理エラーを通知するために提供される例外群の、基底クラスとして用いられます。
以下は、定義例です。
class logic_error : public exception {
public:
explicit logic_error(const string& message);
explicit logic_error(const char *message);
};
※ デフォルトコンストラクタがないので、クラスオブジェクトを作成する際には、引数が必要です。
※ コンストラクタは explicit 付きなので、「 =形式 」で起動することはできません。
以下は利用例です。
#include <iostream>
using namespace std;
int main()
{
try {
throw logic_error("logic error!!");
}
catch (exception &e) {
cout << e.what() << '\n';
};
}
(1) domain_errorクラス
domain_errorクラスは、logic_errorクラスから派生したクラスです。
このクラスは、ドメインエラーを通知するための例外クラス群の、基底クラスとして機能します。
以下は、定義例です。
class domain_error : public logic_error {
public:
explicit domain_error(const string& message);
explicit domain_error(const char *message);
};
以下は利用例です。
#include <iostream>
using namespace std;
int main()
{
try {
throw domain_error("ドメインエラー!!");
}
catch (exception &e) {
cout << "e.what() : " << e.what() << '\n';
cout << "typeid(e).name() : " << typeid(e).name() << '\n';
};
}
(2) invalid_argumentクラス
invalid_argumentクラスは、logic_errorクラスから派生したクラスです。
このクラスは、無効な引数を通知するための例外クラス群の、基底クラスとして機能します。
以下は、定義例です。
class invalid_argument : public logic_error {
public:
explicit invalid_argument(const string& message);
explicit invalid_argument(const char *message);
};
以下は利用例です。
#include <bitset>
#include <iostream>
using namespace std;
int main() {
try {
cout << "◆1. ";
bitset<8> b1(string("01100110"));
cout << b1 << '\n';
cout << "◆2. ";
bitset<8> b2(string("01100112"));
cout << b2 << '\n';
}
catch (exception &e) {
cout << "e.what() : " << e.what() << '\n';
cout << "typeid(e).name() : " << typeid(e).name() << '\n';
};
}
(3) length_errorクラス
length_errorクラスは、logic_errorクラスから派生したクラスです。
このクラスは、生成を試みたオブジェクトが長すぎて指定できないことを通知するための例外クラス群の、基底クラスとして機能します。
以下は、定義例です。
class length_error : public logic_error {
public:
explicit length_error(const string& message);
explicit length_error(const char *message);
};
以下は利用例です。
#include <iostream>
using namespace std;
class Name {
string name;
public:
Name(string s) {
if (s.length() > 20) throw length_error("too long!!");
name = s;
}
};
int main()
{
try {
Name a11("Taiheimasu Sakurazaemon");
}
catch (exception &e) {
cout << "e.what() : " << e.what() << '\n';
cout << "typeid(e).name() : " << typeid(e).name() << '\n';
};
}
(4) out_of_rangeクラス
out_of_rangeクラスは、logic_errorクラスから派生したクラスです。
このクラスは、引数が有効範囲外であることを通知するための例外クラス群の、基底クラスとして機能します。
以下は、定義例です。
class out_of_range : public logic_error {
public:
explicit out_of_range(const string& message);
explicit out_of_range(const char *message);
};
以下は利用例です。
#include <string>
#include <iostream>
using namespace std;
int main() {
try {
string s1("abcde");
string s2("fgh");
s1.append(s2, 5, 3);
cout << s1 << endl;
}
catch (exception &e) {
cout << "e.what() : " << e.what() << '\n';
cout << "typeid(e).name() : " << typeid(e).name() << '\n';
}
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7205227
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック