如何定义自己的异常类


相信很多朋友在写代码的过程中,都会需要加入大量的try和catch来扑捉异常信息和处理异常操作。比如程序在发布出去之后,程序可能出现这样或者那样的问题,如果在代码中加入了异常的操作之后,可以方便定位问题。

1.首先要定义自己的异常操作类,比如你可能会有这样的需求,需要记录抛出异常的文件名,异常的行号,以及自己定义的错误信息,例如指针为空等各式各样的错误。下面请看如下代码:

class MyExcepction  
{  
public:   
	MyExcepction(int errorId,string err_info, int err_line,string err_file)  
	{  
		m_errorId = errorId;   // 错误Code,可以是你自己定义的err code
		m_errorLine = err_line;// 发生错误的行号
		m_errorInfo = err_info;// 发生错误的信息
		m_errorFile = err_file;// 错误的文件名
	}  

	MyExcepction( MyExcepction& myExp)   // 拷贝构造函数
	{   
		this->m_errorId = myExp.m_errorId;
		this->m_errorFile = myExp.m_errorFile;
		this->m_errorLine = myExp.m_errorLine;
		this->m_errorInfo = myExp.m_errorInfo;
	}  

	~MyExcepction()  
	{   
		std::cout << "~MyExcepction is called" << std::endl;  
	}  

	// 打印错误信息,你自己可以DIY,比如可以以写Log的形式记录下来。 
	void PrintErrorInfo()
	{  
		cout << "err file " << m_errorFile << "\n" 
						<< "err line " << m_errorLine << "\n" 
						<< "err code " << m_errorId <<"\n"
						<< "err info " << m_errorInfo << endl;
	}  

private:      
	int m_errorId; 
	int m_errorLine;
	string m_errorInfo;
	string m_errorFile;

};  

2.异常类写好之后,你就可以在实际的代码中使用你自己定义的异常对象了。比如下面我写了一个简单使用的示例代码

int main(int argc, char* argv[])  
{
	int throwErrorCode = 100;
	cin >> throwErrorCode;
	try{
		if(throwErrorCode == 100){
			throw MyException(throwErrorCode,"err code 100", __LINE__, __FILE__);
		} 
		else throw MyException(throwErrorCode, "err code unknow", __LINE__, __FILE__);
	}catch(MyException &exp) {
		exp.PrintErrorInfo();
		//return -1;
	}
         getchar();// 暂停
	return 0;

这样就可以使用我们自己DIY的异常类了,当然我们这里只是简单的讲述了一种使用方式,实际情况还要根据你的具体情况而来。如果代码非常多,要捕获和处理的异常也非常多的话,这样写代码就看起来不那么见解好看了,所以下面会改写一下上述代码。

3.巧妙使用宏来改写抛出异常以及捕获异常代码
首先我们先定义两个宏

#define ThrowExp(code, msg) throw MyExcepction(code, msg, __LINE__, __FILE__)
#define CatchMyExp()	catch(MyException &exception) {exception.PrintErrorInfo();}

改写上述的使用代码

int main(int argc, char* argv[])  
{
	int throwErrorCode = 100;
	cin >> throwErrorCode;
	try{
		if(throwErrorCode == 100){
			ThrowExp(110, "throwErrorCode == 110");
		} 
		else ThrowExp(throwErrorCode, "error code unknow");
	}CatchMyExp();
	getchar();
	return 0;
}

这样来看是不是简介明了了很多呢。好了,学习不在于生搬硬套,而是在于举一反三。希望大家能各抒己见,不足之处请大家指正。


原创文章,转载请注明出处 http://blog.csdn.net/everpenny/article/details/6654959

欢迎大家关注交流,共同学习共同进步。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值