28.例外と例外処理
C++/CLI における例外処理のプログラミング・モデルは統一されているのですが、そこには基本的に二つの種類があります。
- スタックに巻き戻る例外オブジェクトのコピー生成を含んだ標準 C++ によって定義された例外モデルと
- 常にハンドル型によって投げられ、受け止められるCLI 例外モデル
メタデータの詳細は
§34.15 を参照のこと。
28.1 共通例外クラス
次の例外が適当な C++/CLI の操作によって投げられます。
| 例外名 | 記述 |
| System::ArithmetricException | 割り算の結果が結果型で表現できない時投げられる |
| System::ArrayTypeMismatch | 配列操作の要素型がオペランドと一致しない時投げられる |
| System::DivideByZeroException | 整数を0で割ろうと試みた時に投げる例外 |
| System::ExecutionEngineException | 実行エンジンの内部状態がおかしくなった時投げる例外。それは信頼されていないコードがきた時起きる |
| System::IndexOutOfRangeException | インデックスを通してCLI配列のインデックスを指名した時CLI配列の協会外だった時投げる例外 |
| System::InvalidCastException | 実行時、基底型やインターフェイスから派生型への明示的変換に失敗した時投げる例外 |
| System::MissingFieldException | ジャスト・イン・タイム・コンパイラがメタデータ中にフィールドを見つけられなかった時投げる例外。これはアセンブリ間のバージョン化による問題を示す |
| System::MissingMethodException | ジャスト・イン・タイム・コンパイラが関数、コンストラクタ、プロパティ・アクセサやイベント・アクセサを見つけられなかった時投げる例外。これはアセンブリ間のバージョン化による問題を示す |
| System::NullReferenceException | null値ハンドルを参照したとき |
| System::OutOfMemoryException | (gcnewを通した)メモリの領域確保に失敗した時投げられる |
| System::OverflowException | 配列を作成し、サイズが0未満の時、投げられる |
| System::SecurityException | システム・セキュリティが関数呼び出しに許可を与えなかった時投げられる |
| System::StackOverflowException | 実行スタックが実行を継続するのにメモリ不足になった時投げられる |
| System::TypeInitializationException | 静的コンストラクタが例外を投げたとき投げられる例外。まだ、それを受け取る場所はない |
| System::TypeLoadException | 実行エンジンがメタデータ中に型を見つけることができなかった時に投げられる。これはアセンブリ間のバージョン化に問題があることを示している |
28.2 例外指定
もし、プログラムに CLI クラス型の任意のメンバ関数や任意のジェネリック関数に例外指定が含まれていた場合、そのプログラムは不正です。