catch

提供: Appmethod Topics
移動先: 案内検索

キーワード(アルファベット順):インデックス への移動


カテゴリ

ステートメントC++ 固有キーワード

構文

catch (exception-declaration) compound-statement

説明


catch キーワードは、例外処理手法で使われるもので、例外処理のコード ブロックであることを 表します。 そのコード ブロックで具体的にどの例外が処理されるかは、 例外宣言として指定された例外の型によって 決まります。 例外宣言には、Exception 基底クラスから派生した クラスのポインタ、単純型、構造化型、および ... 記法の いずれかを指定することができます。

try {
  throw 1;
} catch (int) {
  ShowMessage("int caught");
}

上記のうち、... 記法以外のどの型でも、捕捉されたオブジェクトに名前を付けることができ、 それを catch コード ブロックで使用することができます。

try {
 throw 1;
} catch (int x) {
ShowMessage("int " + IntToStr(x) + " caught");
}

VCL オブジェクトはどれも例外として使用することができ、catch コード ブロックが終了すると、 補足されたオブジェクトのデストラクタが自動的に呼び出されます。 以下のコードでは "destructor" というメッセージを表示しています。

各ハンドラでは、引数リストで指定された型に一致する例外、またはその型に変換できる例外だけを評価します (ただし、... だけはすべての例外を補足します)。

class MException : public TObject {
 virtual __fastcall ~MException(){ ShowMessage("destructor"); }
};
 
//somewhere in the code
try {
 throw new MException;
} catch (MException*) {
}

同じ 1 つの try に対して複数の catch コード ブロックを指定することができます。 コンパイラは、catch コード ブロックを 宣言された順に登録します。 次の例を見てください。

try {
 throw "exception";
} catch (const char*) {
    ShowMessage("string caught");
} catch (...){
    ShowMessage("anything caught"); 
}

複数の catch ブロックが指定され、... ブロックも存在する場合、 ... ブロックは最後に指定しなければなりません。 コンパイラでエラーが発生したときに、... ブロックが最後でなければ、... ブロックの後の catch コード ブロックは 決して呼び出されることがなく、無駄になります。

catch キーワードを使用できるのは C++ プログラムだけです。 C の場合は __try - __except または __try - __finally を使用してください。