tryブロックのネスト
この記事ではtry-catch構文に関する応用的な内容や補足内容について解説します。
try-catch構文を読んでから閲覧してください。
tryブロックの中にさらにtryブロックを書くことが出来ます。
入れ子構造(ネスト)となります。
try_catch_app_sample1.c++
try { try { throw 0; } catch(int) { throw; } } catch(int) { }
「tryブロック内のtryブロック」でthrowされた例外は「tryブロック内のcatchブロック」で受け取ります。
「tryブロック内のcatchブロック」でthrowされた例外は「tryブロック外のcatchブロック」で受け取ります。
tryブロック内のcatchブロックではthrowする際に値を指定していませんが、その場合はcatchブロックが受け取った値をそのまま渡します。
この場合は0になります。
関数からthrow
try-catch構文ではtryブロック内だけでなくtryブロック内で呼び出した関数からでもthrowができます。
try_catch_app_sample2.c++
int func() { if(【条件】) throw 0; return 0; } int main(void) { try { func(); } catch(int) { 【処理】 } }
関数func()内でthrowをするとtry文内の「func();」が「throw 0」と同じ意味を持ちます。
これは普通の関数でもメンバ関数でもどちらでも使えます。
これを使えばエラーチェック用の関数が作れますね。
オブジェクトのthrow
最後に一点補足ですが、catchブロックを複数定義でthrowする型を変えれば複数のcatchブロックを記述できると解説しました。
これは変数の型だけでなくクラス型でも有効です。
catchブロックの引数にクラス型を指定し、オブジェクトをthrowすることで呼び出せます。
これを使ってエラー処理用のクラスを派生したクラスをthrowし、個別の例外処理を行うという手法がよく用いられます。