例外とは、エラー処理からエラー報告を分離するための手段です。
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 投入する変数;
try
{
throw std::exception();
}
catch (const std::exception& e)
{
std::cout << e.what();
}
組み込みの型を投げると既存の例外と識別が困難なため、独自の型を定義した上でそれを投げるようにします。
class MyException : public std::exception
{
};
void Func()
{
throw MyException();
}
捕捉した例外を、そのまま投げます。
throw;
try
{
}
catch (...)
{
throw;
}
関数が投げる可能性のある例外を、明示する方法です。
| 関数宣言 | 意味 |
|---|---|
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)