您的位置:首页 > 其它

如何定义自己的异常类

2011-08-02 20:38 288 查看
相信很多朋友在写代码的过程中,都会需要加入大量的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;
}


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

原创文章,转载请注明出处 /article/10852201.html

欢迎大家关注交流,共同学习共同进步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: