如何定义自己的异常类

转载自:http://blog.csdn.net/everpenny/article/details/6654959

相信很多朋友在写代码的过程中,都会需要加入大量的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;
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值