「例外」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「C言語では、エラーの通知は、関数の戻り値として返す方法を取られていました。C++でのエラーの通知は、例外(exception) ...」)
 
 
行24: 行24:
  
 
[[例外]]には、いくつもの型があらかじめ用意されています。
 
[[例外]]には、いくつもの型があらかじめ用意されています。
 +
 +
== 文法 ==
 +
シンプルには、以下の構造になります。
 +
<syntaxhighlight lang="cpp">
 +
try {
 +
 +
} catch ( 例外の型 例外を受け取る変数 ) {
 +
 +
}
 +
</syntaxhighlight>
 +
 +
try-catch は、例えば、以下のような構造で使用します。
 +
<syntaxhighlight lang="cpp">
 +
try {
 +
 +
// 処理
 +
 +
// 条件
 +
if ( ... ) {
 +
// エラー
 +
throw exception;
 +
}
 +
 +
} catch ( exception e ) {
 +
// エラー処理
 +
 +
}
 +
</syntaxhighlight>
 +
  
 
== tryとcatch ==
 
== tryとcatch ==
行91: 行120:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== 文法 ==
+
== エラーメッセージを表示する ==
 +
受け取った[[例外]]のwhat()を呼び出すことで、エラーメッセージが取得できます。
 
<syntaxhighlight lang="cpp">
 
<syntaxhighlight lang="cpp">
 
try {
 
try {
} catch ( ... ) {
+
Foo *p = new Foo();
 +
} catch (std::bad_alloc e) {
 +
std::cerr << e.what() << std::endl;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>

2014年7月9日 (水) 15:02時点における最新版

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;
}

関連項目