C++异常捕获使用

一.异常

 C语言:一般使用函数的返回值来表示是否出错. 

 C++语言:使用异常机制进行处理

异常语法:

 (1)异常捕获
 try
{
可能发生异常的语句;(调用函数语句)
}
catch(异常类型 名字)
{
异常处理语解码器
}
catch(异常类型2 名字2)
{
异常处理语句
}
//... 可以有多个catch(...)分支




(2)异常抛出
 throw 异常对象(异常类型);


//异常捕获
void config(void)
{
	FILE* fpFile = fopen("a.txt","rb+");
	if (fpFile == NULL)
	{
		cout<<"throw 之前"<<endl;
		throw 100;
		cout<<"throw 之后"<<endl;
	}
	fclose(fpFile);
};
void init(void)
{
	cout<<"config调用之前"<<endl;
	config();
	cout<<"config调用之后"<<endl;
}

int main(void)
{
	//异常捕获
 	try
 	{
 		cout<<"init函数调用之前"<<endl;
 		init();
 		cout<<"init函数调用之后"<<endl;
 	}
 	catch(int n)
 	{
 		if (n == 100)
 		{
 			cout<<"配置文件读取出错"<<endl;
 		}
 	}
	return 0;
}




  异常的基本用法:
(1) 抛出简单类型变量,使用异常变量的值进行区分不同的异常
(2) 抛出类类型的异常,通过异常的类型进行区分不同的异常.
(3) 从标准异常继承过来. exception
(4) 继续抛出异常,
(5) 异常说明
 返回类型 函数名(形参) throw(异常类型)

  {

}

注意:(1)构造函数可以抛出异常,而且在某些情况下必须抛出异常. 如果对象没有被完全构造就抛出异常, 那么所构造的对象被不完整构造,

而一个不完整的对象的析构函数是不会被调用的。


    (2)最好不要在析构函数中抛出异常,如果这样可能导致程序进入不稳定状态,尽可能捕获析构函数中调用函数抛出的异常。


//自定义类型的异常处理
class MyException
{
private:
	string m_file;	//发生异常的文件
	int	   m_line;	//发生异常的行号
	string m_msg;	//异常的信息.
public:
	MyException(const string& file,int line,const string& msg):m_file(file),m_line(line),m_msg(msg){}
	friend ostream& operator<<(ostream& os,const MyException& Ex)
	{
		os<<"m_file: "<<Ex.m_file<<" line: "<<Ex.m_line<<" msg: "<<Ex.m_msg;
		return os;
	}
};


class MemException : public MyException
{
public:
	MemException(const string& file,int line,const string& msg):MyException(file,line,msg){}
};




class FileException : public MyException
{
public:
	FileException(const string& file,int line,const string& msg):MyException(file,line,msg){}
};




void fun(int num)
{
	if (10 == num)
	{
		throw FileException(__FILE__,__LINE__,"配置文件不存在");
	}
	else if(20 == num)
	{
		throw MemException(__FILE__,__LINE__,"内存溢出");
	}
	else
	{
		//如果没有匹配异常处理,系统接受,程序结束
		throw 100;
	}
}
int main(void)
{
<span style="white-space: pre;">	</span>try
 <span style="white-space: pre;">	</span>{
<span style="white-space: pre;">		</span>fun(30);
 <span style="white-space: pre;">	</span>}
<span style="white-space: pre;">	</span>catch(MemException& eMem)<span style="white-space: pre;">	</span>//这里的引用没有问题,异常机制帮我们处理了.
 <span style="white-space: pre;">	</span>{
 <span style="white-space: pre;">		</span>cout<<eMem<<endl;
 <span style="white-space: pre;">	</span>}
 <span style="white-space: pre;">	</span>catch(FileException& eFile)
 <span style="white-space: pre;">	</span>{
 <span style="white-space: pre;">		</span>cout<<eFile<<endl;
 <span style="white-space: pre;">	</span>}
 <span style="white-space: pre;">	</span>catch(...)<span style="white-space: pre;">	</span>//可以接受任意类型的异常.
 <span style="white-space: pre;">	</span>{
 <span style="white-space: pre;">		</span>cout<<"未知的异常"<<endl;
 <span style="white-space: pre;">	</span>}
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>return 0;
}


//异常说明
class CMyException : public exception
{
public:
	const char* what() const throw()	//不抛出任何的异常
	{
		//cout<<"weikangc is good boy!"<<endl;
		return "weikangc is good boy!";
	}
};


//异常
void temp(int num) throw (CMyException)
{
	if (66 == num)
	{
		//throw CMyException();
		throw 66;
	}
}


int main(void)
{
	try
	{
		temp(66);
	}
	catch(exception& ex)
	{
		cout<<ex.what()<<endl;
	}
	catch(...)
	{
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值