C++例外処理

例外処理について

例外(exception)と例外処理について

例外とは、プログラムの実行の継続を妨げる異常な事象(エラー)のことです。

例外が発生した場合に、現在の処理を中断して別の処理を行うことを例外処理といいます。


例外の捕捉

C++では、「try-catch」で例外を捕捉します。


try{
    // 例外の発生を監視するブロック
}catch(例外オブジェクト){
    // 発生した例外に対する処理ブロック
}

※C++では、Javaにおける「finally」相当の機能はサポートされていません。


例外の発生

例外を意図的に発生させるには、tryブロック内で「throw」を実行します。


throw 例外オブジェクト

tryブロック内で関数呼び出しがある場合、その内部関数もtryブロック内であると見なされます。


#include <iostream>
#include <cstdio>

// 割り算を行う
int divide(int x, int y)
{
    if(y == 0) throw("divide by zero"); // zero除算はthrowする
    return(x / y);
}

int main()
{
    try{
        int rc = divide(3, 0);
    }catch(const char *errmsg){
        printf("ERROR: %s\n", errmsg);
        return(-1);
    }

    return(0);
}

複数の例外捕捉

catchの複数定義

tryブロックが様々な型の例外を投げる場合、catchブロックを連続して任意の数だけ用意することができます。

なお、同じ型のcatchブロックを二重定義することはできません。


#include <iostream>

int divide(int x, int y)
{
    if(y == 0) throw("divide by zero"); // 0の除算ならば、文字列をthrowする
    if((x < 0) || (y < 0)) throw(1);    // 負数ならば、数値をthrowする
    return(x / y);
}

int main()
{
    try{
        int rc = divide(3, -2);
    }catch(const char *errmsg){
        printf("ERROR: %s\n", errmsg);
    }catch(int errnum){
        // 数値がthrowされた場合に処理を行う。
        printf("ERROR: invalid value (errnum=%d)\n", errnum);
    }

    return(0);
}

デフォルトの例外

全ての例外を受け取るには「catch(...)」構文を使います。

これは、指定した全ての型に合わなかった場合の例外処理として用意することができます。


#include <iostream>

int divide(int x, int y)
{
    if(y == 0) throw("divide by zero"); // 文字列型を投げる
    if(x < 0) throw(1);                 // int型を投げる
    if(y < 0) throw('e');               // 文字型を投げる
    return(x / y);
}

int main()
{
    try{
        int rc = divide(3, -2);
    }catch(const char *errmsg){
        printf("ERROR: %s\n", errmsg);
    }catch(...){
        // 文字列以外がthrowされたら本処理を実行する。
        printf("ERROR: exception error occured.\n");
    }

    return(0);
}

C++ 標準ライブラリで定義済みの例外

C++では、次の例外クラスが標準で用意されています。

これらの例外クラスを使う場合は <exception>ヘッダーをインクルードする必要があります。

なお、一般には「std::exception」から派生された「std::logic_error」や「std::runtime_error」クラスやその派生クラスを使います。


std::exception
+- std::runtime_error
   +- std::range_error
   +- std::overflow_error
   +- std::underflow_error
+- std::logic_error
   +- std::domain_error
   +- std::invalid_argument
   +- std::length_error
   +- std::out_of_range
+- std::bad_exception
+- std::bad_cast
+- std::bad_alloc

関連ページ