例外とは、エラー処理からエラー報告を分離するための手段です。
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)