C++

try-catch構文の応用

更新日:

tryブロックのネスト

この記事ではtry-catch構文に関する応用的な内容や補足内容について解説します。
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ブロックを複数定義

これは変数の型だけでなくクラス型でも有効です。
catchブロックの引数にクラス型を指定し、オブジェクトをthrowすることで呼び出せます。

これを使ってエラー処理用のクラスを派生したクラスをthrowし、個別の例外処理を行うという手法がよく用いられます。


-C++

Copyright© C言語/C++入門講座  ツナサーモン , 2019 All Rights Reserved Powered by AFFINGER5.