C++ 例外の Delphi RTL 内へのリーク
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();
// }
}