C++---异常处理

有些话、适合烂在心里 提交于 2020-03-08 04:27:57

什么是异常

异常是一种处理错误的方式。
例如:一个函数发现自己无法处理的错误时就可以抛出异常,让别的函数直接或间接的调用处理这个错误。

  • throw:出现问题时,程序会抛出一个异常。
  • try:尝试破获异常。
  • catch:异常的处理方法。

通常将有可能出现异常的代码放在try{}程序块中,将异常处理的语句放在catch{}程序块中,但是捕获与处理的条件是,抛出的异常的类型与catch块参数的类型匹配。

注意
并不是使用了try来包含可能出现异常的代码后,程序就不会崩溃,通常需要(1)满足某个条件时显示抛出异常(2)使用catch来匹配抛出异常类型。

try
{
	//保护的代码
}
catch(类型名[参数名])
{
	//异常处理的代码I
}
catch(类型名[参数名])
{
	//异常处理的代码II
}
int Func2()
{
	throw "Error";   //尝试抛出异常
}

void Func1()
{
	cout << Func2() << endl;
}
int main()
{
	try
	{
		Func1();   //尝试捕获异常
	}
	catch (const char* errmsg)  //异常处理函数
	{
		cout << "Exception cannot be destroyed" << endl;
	}

	system("pause");	
	return 0;
}

异常处理的顺序

  • 抛出异常
  • 捕获异常
  • 处理异常

抛出异常是由程序员决定什么是异常,是否抛出异常,以及抛出哪种异常。

万能捕获异常catch(…),类似于一种“保底”做法。防止出现异常没有匹配的catch块,导致程序的退出,一般是将catch(…)放在catch块的末尾。

try
{
}
catch(...)
{
}

异常的规范

  • 异常是为了让函数使用者知道该函数可以抛出的异常有哪些。
  • 函数后面直接加throw(类型),列出这个函数可能抛出的所有异常。
  • 函数后面直接加throw(),表示函数不会抛异常。

有可能单个catch不能完全处理一个异常,则希望再交给外层调用函数进行处理,则需要将异常重新抛出。

类中异常的抛出
class Func1
{
protected:
	int _data;
	string _error;
};
class Func2:public Func1
{
	throw "Error";
};
class Func3:public Func1
{
	throw "Error2";
};
int main()
{
	try
	{
		//抛出异常的一般都是派生类
	}
	catch(const Func1& f)
	{
		//异常的处理
	}
	return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!