例外
C言語では、エラーの通知は、関数の戻り値として返す方法を取られていました。C++でのエラーの通知は、例外(exception) と呼ばれる機構が使われます。try, catch, throw の3つのキーワードを使用して実現します。
読み方
- 例外
- れいがい
- try
- とらい
- catch
- きゃっち
- throw
- すろー
- exception
- えくせぷしょん
目次
概要
C++のエラーの通知には、例外が使用されます。例外処理には、try/catch/throwと呼ばれるキーワードを使用します。
たとえば、new演算子でメモリを確保するときに、メモリが確保できれば、ポインタにアドレスが返りますが、メモリが確保できないときに例外が投げられます。new演算子は、エラー時に std::bad_alloc と呼ばれる例外を投げます。
投げられた例外は、catchと呼ばれるキーワードでキャッチ(受け取る)します。
try { Foo *p = new Foo(); } catch (std::bad_alloc e) { std::cerr << e.what() << std::endl; }
例外には、いくつもの型があらかじめ用意されています。
文法
シンプルには、以下の構造になります。
try { } catch ( 例外の型 例外を受け取る変数 ) { }
try-catch は、例えば、以下のような構造で使用します。
try { // 処理 // 条件 if ( ... ) { // エラー throw exception; } } catch ( exception e ) { // エラー処理 }
tryとcatch
try のブロック内で発生した例外をtryに続く、catch で受け取ります。 catch でキャッチしなかった例外は、さらに上位のtryブロックでキャッチできます。
例外処理は、以下のフォーマットで記述します。
try { // 処理 } catch ( ... ) { // エラー処理 }
try は、例外を検出するために使用します。 catchは、例外が発生したときに、例外を受け取るブロックです。tryに続く、catch は複数書くことができます。
例外を受け取ることを以下のように表現します。
- 例外をキャッチ(catch)する
- 例外を受け取る
例外を投げる throw
throwキーワードと例外の型を指定します。
throw std::exception();
例外を発生させることは、以下のように表現されます。
- 例外が投げられる
- 例外がスロー(throw)される
- 例外が送出される
- 例外が発生した
例外を再送出する
キャッチした例外を再送出できます。
try { throw std::exception(); } catch ( std::exception e ) { throw; }
複数の例外を扱うcatch
例外によって、発生する例外の型が異なります。それは、例外によって、必要なエラー処理が異なるからです。そのため、tryに続く、catchのブロックは、複数のブロックを指定できます。例外の型にマッチしたcatchで例外が捕捉されます。
try { // 例外が発生する処理 } catch (ExceptionBadName e) { // 名前のエラー } catch (ExceptionBadPath e) { // パスのエラー } catch (ExceptionBadSize e) { // サイズのエラー }
例外の型を指定せずにキャッチする
例外の型を指定せずに、例外をキャッチすることが可能です。ただし、何をキャッチしたかわかりません。
try { } catch (...) { }
エラーメッセージを表示する
受け取った例外のwhat()を呼び出すことで、エラーメッセージが取得できます。
try { Foo *p = new Foo(); } catch (std::bad_alloc e) { std::cerr << e.what() << std::endl; }
関数全体をtryで囲む
関数全体をtryで囲むことができます。
try_func1.cpp
main関数内のすべての例外をキャッチできます。
/* * try_func1.cpp * Copyright (C) 2014 kaoru <kaoru@bsd> */ #include <iostream> #include <cstdlib> int main(int argc, char const* argv[]) try { throw "exception"; return 0; } catch (const char* e) { std::cerr << e << std::endl; }
関連項目
ツイート