例外仕様(C++)

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

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


関数から送出される可能性のある例外を指定できます。間違った型の例外を関数から送出すると実行時エラーになります。例外仕様の構文は次のとおりです。

exception-specification:

throw (type-id-list) // type-id-list is optional
type-id-list:

type-id
type-id-list, type-id

以下は、例外仕様の付いた関数の例です。

 void f1(); // The function can throw any exception
 void f2() throw(); // Should not throw any exceptions
 void f3() throw(A, B*); // Can throw exceptions publicly derived from A, or a pointer to publicly derived B

このような関数の定義とすべての宣言には、同じ型 ID(type-id)セットで構成される例外仕様が必要です。例外仕様に記載されていない例外が関数から送出された場合、プログラムは unexpected() 関数を呼び出します。

なお、以下のような理由から、例外を指定しない場合もあります。

  • 第 1 に、関数に例外仕様を提供するため、Windows では実行時のパフォーマンスに影響が出ます。
  • 第 2 に、予期しないエラーが実行時に発生するおそれがあります。たとえば、システムでは例外仕様を使用しており、その実装で別のサブシステムを使用しているとしましょう。次に、そのサブシステムを変更して、新しい例外型を送出するようにしたとしましょう。新しいサブシステム コードを使用すると、コンパイラからの事前の指摘なしに実行時エラーが発生する可能性もあります。
  • 第 3 に、仮想関数を使用する場合は、プログラムの設計に違反するおそれがあります。それは、例外仕様が関数型の構成要素と見なされていないからです。たとえば、以下のコードで、派生クラス BETA の vfunc は例外を送出しないように定義されていますが、それは元の関数宣言に違反しています。
 class ALPHA {
 public:
 	struct ALPHA_ERR {
 	};
 
 	virtual void vfunc(void) throw(ALPHA_ERR) {
 	} // Exception specification
 };
 
 class BETA : public ALPHA {
 	void vfunc(void) throw() {
 	} // Exception specification is changed
 };

関連項目