「例外」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「C言語では、エラーの通知は、関数の戻り値として返す方法を取られていました。C++でのエラーの通知は、例外(exception) ...」)
(相違点なし)

2014年7月9日 (水) 14:35時点における版

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 のブロック内で発生した例外を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 (...) {
 
}

文法

try {
} catch ( ... ) {
}

関数全体を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;
}

関連項目