例外

例外とは、エラー処理からエラー報告を分離するための手段です。

try、catch

try
{
    // 例外が投げられる恐れのある処理
}
catch(型1 仮引数)
{
    // 例外の処理
}
catch(型2 仮引数)
{
    // 例外の処理
}
catch( ... ) // すべての型を捕捉する
{
    // 例外の処理
}

投げられた例外の型に一致するcatch文が、例外を捕捉します。解決できない例外は捕捉すべきでなく、すべてを捕捉するcatch(...)も使用すべきではありません。

コンパイラ オプションの/EHaが指定されていないと、Microsoft固有の構造化例外はcatch(...)でも捕捉できません。

try
{
    throw "ERROR";    // char*型の例外を投入
    std::cout << "A"; // throwの後のコードは実行されない
}
catch (int e)
{
    std::cerr << e;
}
catch (char* e) // char*型のこれが捕捉する
{
    std::cerr << e;
}

std::cout << "B"; // catch文で例外が捕捉されたため、その後のコードは実行される

throw

throw 投入する変数;
try
{
    throw std::exception();
}
catch (const std::exception& e)
{
    std::cout << e.what();
}

独自の例外の定義

組み込みの型を投げると既存の例外と識別が困難なため、独自の型を定義した上でそれを投げるようにします。

class MyException : public std::exception
{
};

void Func()
{
    throw MyException();
}

再投入 (rethrow)

捕捉した例外を、そのまま投げます。

throw;
try
{
}
catch (...)
{
    throw;
}

例外指定 (exception specification)

関数が投げる可能性のある例外を、明示する方法です。

関数宣言 意味
void Func() throw();
一切の例外を投げない
void Func() throw(int);
int型のみを投げる
void Func() throw(int, char*);
intとchar*型のみを投げる
void Func() throw(...);
すべての型を投げる

Visual C++のコンパイラは、例外指定を無視します。 コンパイラの警告 (レベル 3) C4290 | MSDN CとC++での例外処理、第6部 | MSDN Robert Schmidt (1999/08/05)

参考

参考書

Microsoft Learnから検索