サイトアイコン ツナのエンジニアブログ

try-catch構文の応用

tryブロックのネスト

この記事ではtry-catch構文に関する応用的な内容や補足内容について解説します。
try-catch構文を読んでから閲覧してください。
https://tunasalmon.com/2018/12/13/try-catch%e6%a7%8b%e6%96%87/

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ブロックを記述できると解説しました。
https://tunasalmon.com/2018/12/14/catch%e3%83%96%e3%83%ad%e3%83%83%e3%82%af%e3%82%92%e8%a4%87%e6%95%b0%e5%ae%9a%e7%be%a9/

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

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


(adsbygoogle = window.adsbygoogle || []).push({});

モバイルバージョンを終了