2018年01月04日
《その219》 例外処理(1)
以下は、例外処理の基本事項の確認です。プログラムでは、多相的クラスへの参照のダウンキャストに失敗することにより、例外 bad_cast を送出させています。
// ------------------------------------
#include <iostream>
using namespace std;
class A {
public:
virtual ~A() { }
};
class B : public A { };
int main() {
A a;
try {
dynamic_cast<B&>(a);
// ここで、参照のダウンキャストに失敗
// するので、例外 bad_cast
// が送出されます。
}
// try { ・・・・・・ } の部分は、tryブロックと
// 呼ばれます。
catch (bad_alloc& e) {
cout << e.what();
cout << " 終了します。\n"; exit(1);
}
catch (bad_typeid& e) {
cout << e.what();
cout << " 終了します。\n"; exit(1);
}
catch (bad_cast& e) {
// ここで、例外 bad_cast を捕捉します。
cout << e.what();
cout << " 終了します。\n"; exit(1);
}
catch (...) {
cout << "Error!";
cout << " 終了します。\n"; exit(1);
}
// tryブロックに続く catch() { } の部分は、
// 例外ハンドラと呼ばれます。
// 複数個の例外ハンドラを連続
// して置くことができます。
// bad_allocクラス, bad_typeidクラス,
// bad_castクラスの各クラスは、
// メンバ関数 what を呼び出す
// ことで、エラーの内容を簡潔
// に示すことができます。
// catch(...) の "..." は、未捕捉の全例外
// を捕捉するための記号です。
// catch (bad_alloc& e) のように、例外を参
// 照で受け取っているのは、bad_alloc
// がクラス型の例外なので、引数として
// 受け取る際のコスト削減のためです。
// エラーを捕捉した後は、任意の処理を行う
// ことが可能です。
// このプログラムでは、エラー
// 捕捉後、プログラムを終了し
// ています。
}
// ------------------------------------

この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7160063
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック