例外処理

  C++ には,プログラム実行中に起こったエラーを検知して,ユーザ固有の処理を行うための方法があります.それが,例外処理exception )です.

  まず,try ブロックはブロック内で発生する例外を捕まえます.つまり,try ブロックには,例外が発生する可能性のある処理を書きます.例外が発生すると,throw 文によって例外が try ブロックに渡され,try ブロックの後ろにある throw された型と同じ型を受け取る catch ブロックで処理されます( catch ブロックは複数書くことができます).詳しくは,次のプログラム例を見て下さい.

(プログラム例 9.1 ) 例外処理

/****************************/
/* 例外処理                 */
/*      coded by Y.Suganuma */
/****************************/
#include <iostream>
#include <math.h>
using namespace std;

void sq(double x, double y)
{
	if (x < 0.0 && y < 0.0) {
		char *str = "両方とも負\n";
		throw str;
	}
	else if (x < 0.0 || y < 0.0) {
		char *str = "片方が負\n";
		throw str;
	}

	double z = sqrt(x+y);
	cout << z << endl;
}

int main()
{
	try {
		double x, y;
		cout << "1 つ目のデータは? ";
		cin >> x;
		cout << "2 つ目のデータは? ";
		cin >> y;
		sq(x, y);
	}

	catch (char *str)
	{
		cout << str;
	}

	return 0;
}
		

  このプログラムに,例えば,-1 と -2 を入力し実行すると,以下のような結果が出力されます.
1.73205
両方とも負		
  上の例では,char * 型を送出しましたが,次の例のように,クラスのオブジェクトを送出することも可能です.なお,あまり意味はありませんが,1 番目の引数だけが負の場合は,その値を正に修正して再実行しています.

/****************************/
/* 例外処理                 */
/*      coded by Y.Suganuma */
/****************************/
#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;

class Negative {
	public:
		char *str;
		double x, y;
		Negative(char *str, double x, double y) {
			this->str = new char [100];
			strcpy(this->str, str);
			this->x = x;
			this->y = y;
		}
		void message(int sw) {
			if (sw == 0)
				cout << "    1 番目の値を正にして再実行しました\n";
			else
				cout << "    データを修正してください\n";
		}
};

void sq(double x, double y)
{
	if (x < 0.0 && y < 0.0)
		throw Negative("両方とも負\n", x, y);
	else if (x < 0.0 || y < 0.0)
		throw Negative("片方が負\n", x, y);

	double z = sqrt(x+y);
	cout << z << endl;
}

int main()
{
	try {
		double x, y;
		cout << "1 つ目のデータは? ";
		cin >> x;
		cout << "2 つ目のデータは? ";
		cin >> y;
		sq(x, y);
	}

	catch (Negative &ng)
	{
		cout << ng.str;
		if (ng.y > 0.0) {
			ng.message(0);
			sq(-ng.x, ng.y);
		}
		else
			ng.message(1);
	}

	return 0;
}
		

  このプログラムに,例えば,-1 と 2 を入力し実行すると,以下のような結果が出力されます.
1.73205
片方が負
    1 番目の値を正にして再実行しました
1.73205