例外処理

例外処理

C++には例外処理というエラー処理機能があります。

エラー処理により、エラーの起こりやすい

  • メモリ確保
  • ファイル処理

の例外を処理しやすくなります。ここでは例外処理について解説します。

例外処理の基本的な流れ

例外処理では

  1. tryで囲む
  2. throwでエラーを投げ
  3. catchでエラーを補足する

という流れになります。以下にサンプルプログラムを載せておきます。

サンプルプログラム

#include <iostream>
using namespace std;

int main(void){
	try{
		throw 1;
	}catch(int i){
		cout<<i<<"\n";
	}
	return 0;
}

実行すると

1

と表示されます。

tryの中にある

throw 1;

で数字1が投げられます。すると、catchのint iに1が代入され1が表示されます。

ちなみに、throwの文章がなければcatch内の命令は実行されません。

例外の種類を把握する

throwで投げる値に応じてエラー処理を変えることができます。

例えば、throwによって文字が送られてきた処理と、intが送られてきた処理を分けることが可能です。

具体的には

try{

}catch(int i){
//intが送られてきた場合の処理
}catch(char *str){
//文字列が送られてきた場合の処理
}

とします。catchを複数書けばOKです。以下にサンプルを載せます。

サンプルプログラム

#include <iostream>
using namespace std;

int main(void){
	try{
		throw 1;
	}catch(int i){
		cout<<"int\n";
	}catch(char *str){
		cout<<"文字列\n";
	}

	try{
		throw 'f';
	}catch(int i){
		cout<<"int\n";
	}catch(char str){
		cout<<"文字\n";
	}
	return 0;
}

実行すると

int
文字

が表示されます。

あと、すべての例外に対処する場合は

try{

}catch(…){
//すべての例外処理
}

とします。catch(…)のように…とするのがポイントです。こうすることで、try内で生じたすべての例外が生じるとcatch(…)に来ることになります。

関数やenumとの組み合わせ

関数内でエラーを提示したり、エラー結果をenumによりわかりやすくすることができます。以下に例をあげます。

#include <iostream>
using namespace std;
 
enum myError{error1,error2,error3};
void func(){
    throw error2;
}
 
int main(void){
    try{
	    func();
	}catch(myError e){
	    cout << e << endl;
	}
    return 0;
}

1

まず、enumによりerror1,error2,error3を定義しています。

enum myError{error1,error2,error3};

このmyErrorをエラー処理の際に捕まえるわけです。これによりerror1,2,3のどれかがわかりますね。

次に、関数funcはかならずエラーをおこしerror2を投げます。

void func(){
    throw error2;
}

そして、error1=0,error2=1,error3=2なので、error2=1がコンソールに表示されます。エラー処理の際に便利なので使ってみてください。

著者:安井 真人(やすい まさと)