学习C++ primer 之路 - ( 第十五章之 异常)

C++有一种异常处理机制,捕获程序出现的某种错误信息,开发人员可以对这种错误进行捕获再进行相应的处理

基本语句 :

try{}catch  还有一个throw,这个throw时抛出的意思,是在可能出现异常错误的函数中进行使用

直接例子:

float func (float a,float b)
{
    //这是一个作的除法函数
    //被除数是不能为0的这样做是没有意义的 如果 a * 0 这样做程序会崩溃掉
    //为什么b不能直接==0? because b是一个浮点类型它=0其实是近似看成0的所以需要采用这种区间的方法来判断是不是0(doubl类型也是一样无非就是多加了几个0而已)
    if(b > -0.000001 && b < 0.000001)    
    {
        throw "错误: 被除数为零";      //发现被除数b = 0;立刻抛出异常 这里用的是char *类型 捕获的时候需要一样的类型才可以捕获到
    }
    return a / b;
}
int main ()
{
    float a = 1,b = 0;    //设置被除数0;
    try        
    {
        //这里是可能会发生异常的函数执行
        func();
    }    
    catch(const char * err)        //这里为什么要用const char *?因为我上面func函数的throw 抛出的是一个字符串常量 所以catch捕获的时候捕获相应的类型
    {
        //catch(类型)
        cout << err << endl;    //打印错误
        
    }

    system("pause");    
    return 0;
}

上面例子已经被安排的明明白白的...

还有一种catch的写法:   catch(...){}

"..."表示通用类型 也就是说

catch(...)表示可以捕获任意类型的异常

但是catch一定要写在所有catch精准类型的最后面 否则会报错, 直接忽略catch(...)后面的catch捕获

-----------------------------------------------------------------------------------------------------------------------------------

还有一个就是可以用一个类作为异常抛出

也就是异常类

将对象作为用作异常类型

最重要的优点之一 : 可以使用不同的异常类型来区分不同的函数在不同情况下引发的异常

例子(这个例子直接引用书上的例子,我觉得已经很明白了):

头文件:

#include <iostream>

using namespace std;
//两个异常类
class bad_heam
{
private:
	double v1;
	double v2;
public:
	bad_heam(double a, double b) :v1(a), v2(b) {}
	void message();
};
inline void bad_heam::message()
{
	cout << "hmean(" << v1 << ", " << v2 << "): "
		<< "invalid arguments:a = -b\n";
}
class bad_gmean
{
private:
	
public:
	double v1;
	double v2;
	bad_gmean(double a, double b) :v1(a), v2(b) {}
	const char * message();
};
inline const char * bad_gmean::message()
{
	return "gmean() arguments should be >= 0\n";
}

cpp:

#include <cmath>
#include "exc_mean.h"
double hmean(double a, double b);
double gmean(double a, double b);
int main()
{
	double x, y, z;
	cout << "Enter two numbers: ";

	while (cin >> x >> y)
	{
		try
		{
			z = hmean(x, y);
			cout << "Harmonic mean if " << x << " and " << y << " is " << z << endl;
			cout << "Geometric mean of " << x << " and " << y << " is " << gmean(x, y) << endl;
			cout << "Enter next set of number <q to quit>: ";
		}
		catch (bad_heam & bg)
		{
			bg.message();
			cout << "Try again\n";
			continue;
		}
		catch (bad_gmean & hg)
		{
			cout << hg.message();
			cout << "Values user: " << hg.v1 << ", "
				<< hg.v2 << endl;

			cout << "Sorry,you don't get to play any more.\n";
			break;
		}

	}
	cout << "BYE.\n";
	system("pause");
	return 0;
}
double hmean(double a, double b)
{
	if (a == -b)
	{
		throw bad_heam(a, b);        //抛出头文件定义的异常类
	}
	return 2.0 * a * b / (a + b);
}
double gmean(double a, double b)        //这是一个求乘积的平方根 绝对不能为负数
{
	if (a < 0 || b < 0)    //为负数就直接抛异常
	{
		throw bad_gmean(a, b);//抛出头文件定义的异常类
	}
	return sqrt(a*b);
}

C++11异常规范

上面所说的是C++98版本的,C++11摒弃了它,但是它仍处于标准之中

C++11支持一种特殊的异常规范 例如: 

double mean () noexcept

关键字: noexcept  指出该函数不会引发异常 是确定的 

不过业界人士对异常 是由争论的

猜你喜欢

转载自blog.csdn.net/z1455841095/article/details/82454429
今日推荐