代码改变世界

C++学习笔记--异常简介

2014-12-02 23:40  rangers  阅读(222)  评论(0编辑  收藏  举报

C++异常是对程序运行过程中发生的异常情况(如被0除)的一种响应。异常提供了将控制权从程序的一个部分传递到另一部分的途径。

1、对异常的处理有3个部分组成:

(1)引发异常

(2)捕获有处理程序的异常

(3)使用try块

C++异常的简单例子:

double hmean(double a,double b)
{
	if (a == -b)
		throw "bad hmean() arguments: a = -b not allowed";//引发异常
	return 2.0 * a * b / (a + b);
}

void test_exception()
{
	double x, y, z;
	cout << "Enter two number:";
	while (cin >> x >> y)
	{
		//使用try catch进行异常捕获和处理
		try
		{
			z = hmean(x,y);
		}
		catch (const char * s)
		{
			cout << s << endl;
			cout << "Enter a new pair of numbers:";
			continue;
		}
		cout << "Result:" << z << endl;
		cout << "Enter next two numbers:";
	}
	cout << "Quit";
}

 运行情况如下:

异常类型可以是字符串或其他C++类型,通常为类类型。

将类对象作为异常类型的例子:

class bad_hmean
{
private:
	double v1;
	double v2;
public:
	bad_hmean(int a = 0, int b = 0)
		:v1(a)
		,v2(b)
	{

	}
	void mesg()
	{
		cout << "hmean(" << v1 << "," << v2 << "):" << "Invalid arguments: a = -b\n";
	}
};

//使用异常规范对函数定义进行限定,指出它将引发那些类型的异常
double hmean(double a,double b) throw(bad_hmean)
{
	if (a == -b)
		throw bad_hmean(a,b);//引发异常
	return 2.0 * a * b / (a + b);
}

void test_exception()
{
	double x, y, z;
	cout << "Enter two number:";
	while (cin >> x >> y)
	{
		//使用try catch进行异常捕获和处理
		try
		{
			z = hmean(x,y);
		}
		catch (bad_hmean & bh)
		{
			bh.mesg();
			cout << "Enter a new pair of numbers:";
			continue;
		}
		cout << "Result:" << z << endl;
		cout << "Enter next two numbers:";
	}
	cout << "Quit";
}

 

2、exception异常类

在C++中,exception通常作为其他异常类的基类

C++基本异常类的层次结构:

exception:

--logic_error  (典型的逻辑错误)

      domain_error  (参数不在定义的范围)

      invalid_argument (非法的参数)

      length_error (没有足够空间来执行所需操作)

      out_of_bounds (索引错误)

--runtime_error (运行期间发生但难以预计和防范的错误)

      range_error

  overflow_error

      underflow_error

--bad_alloc 内存分配导致的异常

如果上述异常类,无法满足要求,应当从logic_error 或runtime_error派生一个异常类,以确保自定义的异常类可以归入同一个继承层次结构中。

 

关于异常需要注意的地方:

(1)异常规范不适用于模版,因为模版函数引发的异常可能随特定的具体化而异。

(2)异常处理虽然很重要,但会增加编程的工作量,增大程序,降低程序的速度。