C++异常处理

来源:互联网 发布:linux系统如何上网 编辑:程序博客网 时间:2024/06/06 00:44

程序中的异常主要分为两种:

1:编译时的异常   ->主要是语法错误,比较容易修改。

2.运行时的异常->程序逻辑错误,运行时(崩溃,或结果异常)。

《抛出异常》

          c++的异常处理手机主要有三部分有:try(检查),throw(抛出),catch(捕获)。通常,监测异常情况的程序语句包含在try中,如果try块中发生了异常。则用throw处理。异常由catch捕获,并对异常进行处理。

         c++构造函数可以抛出异常。c++标准指明析构函数不能、也不应该抛出异常。

原因:

1,如果析构函数抛出异常,则异常点之后的程序不会扫行,如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏的问题。

2,通常异常发生时,c++的机制调用已经构造对象的析构函数来释放资源,此时若析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,会造成程序崩溃的问题。

格式:

try

{

  被检查语句

   throw 异常

}

catch(异常类型1)

{

进行异常处理的语句1

}

catch(异常类型2)

{

进行异常处理的语句 2

}


捕获异常catch()

1可以抛出基本数据类型异常
2可以抛出复杂数据类型异常(如结构体)
3可以在catch中重新抛出该异常或者其它异常。

注:
1.catch语句块可以用多个,但是必须出现在try语句块之后,在try程序之前出现catch语句块是错误的。
2.在catch后面的括号中包含的是数据类型的声明,只有在出现异常的情况下,catch部分的函数才会执行。
3.catch之后括号中必须含有数据类型,或(…任意异常。)捕获异常时是按照该数据类型匹配调用哪一个catch来进行处理异常的。

例:

#include <iostream>

using namespacestd;

class CExceptionClass

{

private:

   char *m_szMessage;

public:

    CExceptionClass(constchar *_message)

    {

       m_szMessage=newchar[strlen(_message)+1];

       strcpy(m_szMessage, _message);

    }

   void show()

    {

       cout<<m_szMessage<<endl;

        

    }

   ~ CExceptionClass()

    {

       delete []m_szMessage;

    }

};


int main(int argc,constchar * argv[])

{


   cout<<"主程序开始……"<<endl;

   try

    {

       int nFlag=0;

        cout<<"1---------throw int "<<endl;

        cout<<"2---------throw char "<<endl;

        cout<<"3---------throw char* "<<endl;

        cout<<"4---------throw float "<<endl;

        cout<<"5---------throw CExeeptionClass "<<endl;

        cout<<"Please choose: "<<endl;

       cin>>nFlag;

       if (nFlag<1||nFlag>5)

        {

           cout<<"输入错误。"<<endl;

           return0;

        }

       switch (nFlag)

        {

           case1:

               throw100;//抛出的必须是数据,不能是类型。

               break;

           case2:

               throw'A';

               break;

           case3:

               throw"A";

               break;

           case4:

               throw"100.0ff";

               break;

           case5:

               throw new CExceptionClass("A");

               break;

                

            

        }

        

        

    }catch (int)

    {

        cout<<"catching int"<<endl;

    }

    catch(char)

    {

        cout<<"catching char"<<endl;

    }

    catch (char*)

    {

        cout<<"catching char *"<<endl;

    }

    catch(float)

    {

        cout<<"catching float"<<endl;

    }

    catch(CExceptionClass *ex)

    {

        cout<<"catching CExceptionClass"<<endl;

    }

   catch(...)

    {

        cout<<"catching any throw"<<endl;

    }

   cout<<"退出主程序。"<<endl;

    

    

    

    

   return0;

}




原创粉丝点击