C++ 例外の Delphi RTL 内へのリーク

提供: RAD Studio
移動先: 案内検索

C++ における標準的な例外処理 への移動


Delphi 以外で生成された例外やハードウェアに関係する例外が Delphi RTL で発生した場合、その例外は EExternalException としてマッピングされます。 C++ 例外は、明示的に捕捉されない場合には最終的に Delphi 例外ハンドラで捕捉されるため、アプリケーションでは外部例外 EEFFACE が発生します。

C++ の標準例外やユーザー定義の C++ 例外は Delphi ランタイムでは処理できません。 つまり、標準テンプレート ライブラリ(STL)Dinkumware 標準 C++ ライブラリなどの C++ ライブラリの取り扱いには、もう少し注意が必要になります。 例外が明示的に捕捉されずに Delphi ランタイム内にリークする場合は、アプリケーションで外部例外 EEFFACE が発生し、アプリケーションがクラッシュします。

以下の簡単な例では、STL ライブラリをそこで発生する例外に注意を払わずに使用すると、結局アプリケーションがクラッシュするおそれがあることを示しています。

この例は、整数のベクタに対して何らかの一般的な操作を行う VCL アプリケーションです。 コードでは、ベクタのメソッドで発生する C++ 例外のチェックを行っていないため、ある時点でアプリケーションがクラッシュし、外部例外 EEFFACE が発生します。

void __fastcall TForm1::Button3Click(TObject *Sender) {
	std::vector<int> vect;
	vect.push_back(112);
	vect.push_back(222);
	Label1->Caption = vect.at(2);
 // the code does not check for std::out_of_range exception
 // correct code will be :
//	try {
//		Label1->Caption = vect.at(2);
//	}
//	catch (std::out_of_range& e) {
//		Label1->Caption = e.what();
//	}
}

関連項目