天天看点

C++异常处理之abort()、异常机制、exception 类

程序运行时有时会遇到错误,导致程序无法正常运行下去,通常程序员会试图预防这种意外。C++异常为处理这种情况提供了一种功能强大而灵活的工具。这里仅介绍三种:

  • 调用abort()函数
  • 异常机制
  • exception 类

一、调用abort()函数

abort()函数的原型位于头文件cstdlib(或stdlib.h)中,其典型实现是向标准错误流(即cerr使用的错误流)发送 abnormal program termination(程序异常终止),然后终止程序。调用Abort()时,不进行任何清理工作,直接终止程序。

示例程序1

#include"iostream"
#include"cstdlib"

using namespace std;

double hmean(double a, double b);
int main()
{
	double x, y, z;
	cout << "Enter two numbers:";
	while (cin >> x >> y)
	{
		z = hmean(x, y);
		cout << "Harmonic mean of" << x << "and" << y << "is" << z << endl;
		cout << "Enter next set of numbers:";

	}
	cout << "end" << endl;
	system("pause");
	return 0;
}

double hmean(double a, double b){
	if (a == -b){
		cout << "unenable arguments to hmean()" << endl;
		abort();
	}
	return 2.0*a*b / (a + b);
}
           

二、异常机制

C++异常是对程序运行过程中发生的异常情况的一种响应。异常提供了将控制权从程序的一个部分传递到另一部分的途径。对异常的处理有3个组成部分:

1.引发异常;

2.使用处理程序捕获异常;

3.使用try块。

C++异常处理的格式 

try
{
   //标识可能出现的异常代码段
   throw  抛出一个异常
} 
catch 
{
  //异常处理程序的类型
}
           
  • try块标识其中特定的异常可能被激活的代码块,它后面跟一个或多个catch块。
  • throw语句实际是跳转,即命令程序跳转到另一条语句。Throw关键字表示引发异常,紧跟后面的值(例如字符串或对象),指出异常特征。Thow语句类似执行返回语句,因为他将终止函数的执行;但throw不是将控制权返回给调用程序,而是导致程序沿函数调用顺序后退,直到找到包含try块的函数。
  • 如果函数引发异常,而没有try块或没有匹配的处理函数,程序最终降调用abort()函数。

示例程序2

#include"iostream"
#include"cstdlib"

using namespace std;

double hmean(double a, double b);
int main()
{
	double x, y, z;
	cout << "Enter two numbers:";
	while (cin >> x >> y)
	{ 
		try{ z = hmean(x, y); }
		catch (const char *s)
		{
			cout << s<< endl;
			//cout << "Harmonic mean of" << x << "and" << y << "is" << z << endl;
			cout << "Enter next set of numbers:";
			continue;
		}
		cout << "Harmonic mean of" << x << "and" << y << "is" << z << endl;
		cout << "Enter next set of numbers:";

	}
	cout << "end" << endl;
	system("pause");
	return 0;
 }

double hmean(double a, double b){
	if (a == -b){
		throw "unenable arguments to hmean()" ;
		
	}
	return 2.0*a*b / (a + b);
}
           

三、exception 类

       较新的C++编译器将异常合并到语言中,例如,为支持该语言,exception头文件(以前为exception.h或except.h)定义了exception类,C++可以把它作为其他异类的基类。代码可以引发exception异常,也可以将exception类作为基类,有一个名为what()的虚拟成员函数,他返回一个字符串,该字符串的特征随实现而异。然而,由于这是一个虚方法,因此可以在从exception派生而来的类中重新定义它。C++库定义了很多基于exception的异常类型。

示例程序3

#include"iostream"

using namespace std;

class nn_error : public std::exception {
public:
	explicit nn_error(const std::string& msg) : msg_(msg) {}
	const char* what() const throw() override { return msg_.c_str(); }
private:
	std::string msg_;
};
double hmean(double a, double b);
int main()
{
	double x, y, z;
	cout << "Enter two numbers:";
	while (cin >> x >> y)
	{
		try{ z = hmean(x, y); }
		catch (const nn_error& e)
		{
			cout << e.what() << endl;
			//cout << "Harmonic mean of" << x << "and" << y << "is" << z << endl;
			cout << "Enter next set of numbers:";
			continue;
		}
		cout << "Harmonic mean of" << x << "and" << y << "is" << z << endl;
		cout << "Enter next set of numbers:";

	}
	cout << "end" << endl;
	system("pause");
	return 0;
}

double hmean(double a, double b){
	if (a == -b){
		throw nn_error("unenable arguments to hmean()");

	}
	return 2.0*a*b / (a + b);
}
           

更多资源:http://blog.csdn.net/zhy_cheng/article/details/8217896