【C++入门】C++的异常管理机制介绍

【C++入门】C++的异常管理机制介绍,第1张

1、什么是异常

(1)异常可以理解成可能导致程序不能正常运行的情况,或者说不希望发生的情况;
(2)异常的发生是可不预知的,我们不知道何时会发生何种异常,要是我们提前知道就处理了;
(3)所以我们在写程序时,就需要考虑将来程序运行时可能遇到的异常情况,并针对各种异常情况进行处理;
补充:中断属于异常的一种;

2、C语言如何处理异常

(1)函数返回值:C程序可以判断调用函数的返回值来判断本次调用是否成功,如果不成功则需要做相应处理;
(2)if判断:在函数内部,用if条件判断去判断当前情况是否符合预期,如果属于异常情况要么处理异常要么直接返回错误码。比如:判断函数传参的指针是否为NULL、指针变量解引用前判断是否为NULL等;

3、C++的异常处理机制介绍

(1)C++新增异常处理机制,主要思路:写代码时,对可能出现异常的代码进行监视,并且判断当前是否发生异常,如果发生异常则抛出异常,会有专门的函数去捕捉异常,对异常做出处理;
(2)由于有专门的异常处理函数去捕捉异常,异常处理函数可以去规避或者纠正这个异常,这样当发生异常时不会导致程序终止;

4、C++异常处理的关键字

(1)try:将可能发生异常的代码用try括起来,监视这些代码;
(2)throw:抛出异常,必须在try包裹的保护代码中使用才能起到正常的效果;
(3)catch:用于捕获异常以及处理异常,catch可以指定捕捉何种异常;

5、 异常处理机制的示例代码
#include 

using namespace std;


//函数功能:计算两个数的除法,对除数是0的异常情况进行处理
int main(void)
{
// 让用户输入2个数,然后程序返回他的相除
	cout << "please input 2 numbers" << endl;
	int m, n;
	cin >> m >> n;
	
	// C++中用异常处理机制来处理
	try
	{
		// try括号里的代码就是有可能触发异常的代码
		if (n == 0)
			throw (-1);	//抛出一个int型的异常
			
		cout << "m / n = " << m/n << endl;
	}
	
	//捕捉int型的异常,传参e就是throw抛出的异常值
	catch (int e)		// catch的()里写上要抓取的异常类型
	{
		cout << "catch int " << e << endl;
	}
	
	//捕捉double 型的异常,传参e就是throw抛出的异常值
	catch (double e)		// catch的()里写上要抓取的异常类型
	{
		cout << "catch double " << e << endl;
	}
	
	return 0;
}

throw和catch的匹配规则:throw抛出异常的数值类型,会自动去匹配是否有同类型的catch,如果匹配上则把throw抛出的异常值作为传输传给catch;

6、函数的异常申明 6.1、函数声明异常的形式
void func(void) throw(A, B, C);		// 这种声明就是告诉调用者func有可能抛出3种异常

(1)在项目开发中,我们可能将自己的代码封装成库供其他人调用,其他人并不清楚函数的内部实现,更不清楚函数可能抛出的异常情况,所以我们需要在函数申明中告诉调用者;
(2)在函数申明时,用throw关键字告诉函数调用者,该函数可能会抛出何种类型的异常,方便函数调用者去处理可能的异常情况;

6.2、函数声明异常的特殊情况

(1)throw一个异常后如果没有catch匹配会层层向外传递直到被catch为止。所谓的外层就是函数调用关系,比如:A函数调用B函数,B函数中发生异常但是没有catch匹配去处理,就会把异常传递给A函数进行处理;
(2)函数声明时throw() 表示函数不会抛出任何异常,throw的列表为空;
(3)C++11中引入noexcept关键字替代throw()表示函数不会抛出任何异常;
(4)函数声明没有throw列表,则表示函数可能会抛出任意类型的异常;

7、异常处理机制的优劣势

优势:
(1)可以使得代码的层次更加清晰,可以将常规代码和异常处理代码分离开。
(2)用C语言写代码时会频繁使用if去判断当前情况是否正常,if的频繁使用导致代码层次很多;发生异常一般马上就处理异常情况,导致业务代码和异常处理代码是一起的;
(3)C++的异常处理机制,可以在业务代码出用throw抛出异常,而用catch专门去处理异常;
劣势:
(1)增加异常处理机制会增加开销,这是基本规律了,新增某些特性就是语言本身做更多的工作,降低编程难度;
(2)发生异常throw抛出异常后,throw后面的代码就不会运行,所以程序的运行顺序是未知的,程序员需要考虑下程序正常和异常的执行顺序会不会带来问题;比如:不同的执行顺序是否会发生内存泄漏;

8、标准库中的exception类

(1)在代码中,有一些通用的异常情况,当代码发生这些异常情况时会自动抛出异常,对于这种异常我们不必在代码中调用throw去抛出异常;比如:打开文件失败、类型不匹配等情况;
(2)如果异常不是通用情况,则需要我们自己写catch函数去捕捉特定的异常并处理;

9、推荐

我会在C++专栏持续根据更新C++相关的知识点,这里也给大家推荐一款学习C++的神器,我也是在用这一款神器在学习C++。
链接:学习神器跳转
如果你是想入门C++这门语言或者是找C++岗位的工作,都推荐你试试这个网站,里面有针对C++知识点的选择题、编程题,更有C++岗位的面试题

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/3002761.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)

保存