欢迎来到天天文库
浏览记录
ID:7781003
大小:51.50 KB
页数:9页
时间:2018-02-25
《c++异常处理机制示例及讲解》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、c++异常处理机制示例及讲解(含源代码) 这两天我写了一个测试c++异常处理机制的例子,感觉有很好的示范作用,在此贴出来,给c++异常处理的初学者入门。本文后附有c++异常的知识普及,有兴趣者也可以看看。 下面的代码直接贴到你的console工程中,可以运行调试看看效果,并分析c++的异常机制。 #include"stdafx.h" #include #include #include //内存泄露检测机制 #define_CRTDBG_MAP_ALLOC #ifdef_DEBUG #definen
2、ewnew(_NORMAL_BLOCK,__FILE__,__LINE__) #endif //自定义异常类 classMyExcepction { public: //构造函数,参数为错误代码 MyExcepction(interrorId) { //输出构造函数被调用信息 std::cout<<"MyExcepctioniscalled"<3、<<"copyconstructiscalled"<m_errorId=myExp.m_errorId; } ~MyExcepction() { //输出析构函数被调用信息 std::cout<<"~MyExcepctioniscalled"<4、 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF5、_CRTDBG_LEAK_CHECK_DF); //可以改变错误码,以便抛出不同的异常进行测试 intthrowErrorCode=110; std::cout<<"inputtestcode:"<>throwErrorCode; try { if(throwErrorCode==110) { MyExcepctionmyStru(110); //抛出对象的地址->由catch(MyExcepction* pMyExcepction)捕获 6、 //这里该对象的地址抛出给catch语句,不会调用对象的拷贝构造函数 //传地址是提倡的做法,不会频繁地调用该对象的构造函数或拷贝构造函数 //catch语句执行结束后,myStru会被析构掉 throw &myStru; } elseif(throwErrorCode==119) { MyExcepctionmyStru(119); //抛出对象,这里会通过拷贝构造函数创建一个临时的对象传出给catch //由catch(MyExcepction myExcepction)捕获 //在catch语句中会再次调用通过拷贝构造函数创建临时对象复制这里7、传过去的对象 //throw结束后myStru会被析构掉 throw myStru; } elseif(throwErrorCode==120) { //不提倡这样的抛出方法 //这样做的话,如果catch(MyExcepction* pMyExcepction)中不执行delete操作则会发生内存泄露 //由catch(MyExcepction* pMyExcepction)捕获 MyExcepction*pMyStru=newMyExcepction(120); throwpMyStru; } else { //直接创建新对象抛出 8、//相当于创建了临时的对象传递给了catch语句 //由catch接收时通过拷贝构造函数再次创建临时对象接收传递过去的对象 //throw结束后两次创建的临时对象会被析构掉 throwMyExcepction(throwErrorCode); } }catch(MyExcepction* pMyExcepction) { //输出本语句被执行信息 std::cout<<"执行了catch(MyExcepction* pMyExcepction)"<
3、<<"copyconstructiscalled"<m_errorId=myExp.m_errorId; } ~MyExcepction() { //输出析构函数被调用信息 std::cout<<"~MyExcepctioniscalled"<4、 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF5、_CRTDBG_LEAK_CHECK_DF); //可以改变错误码,以便抛出不同的异常进行测试 intthrowErrorCode=110; std::cout<<"inputtestcode:"<>throwErrorCode; try { if(throwErrorCode==110) { MyExcepctionmyStru(110); //抛出对象的地址->由catch(MyExcepction* pMyExcepction)捕获 6、 //这里该对象的地址抛出给catch语句,不会调用对象的拷贝构造函数 //传地址是提倡的做法,不会频繁地调用该对象的构造函数或拷贝构造函数 //catch语句执行结束后,myStru会被析构掉 throw &myStru; } elseif(throwErrorCode==119) { MyExcepctionmyStru(119); //抛出对象,这里会通过拷贝构造函数创建一个临时的对象传出给catch //由catch(MyExcepction myExcepction)捕获 //在catch语句中会再次调用通过拷贝构造函数创建临时对象复制这里7、传过去的对象 //throw结束后myStru会被析构掉 throw myStru; } elseif(throwErrorCode==120) { //不提倡这样的抛出方法 //这样做的话,如果catch(MyExcepction* pMyExcepction)中不执行delete操作则会发生内存泄露 //由catch(MyExcepction* pMyExcepction)捕获 MyExcepction*pMyStru=newMyExcepction(120); throwpMyStru; } else { //直接创建新对象抛出 8、//相当于创建了临时的对象传递给了catch语句 //由catch接收时通过拷贝构造函数再次创建临时对象接收传递过去的对象 //throw结束后两次创建的临时对象会被析构掉 throwMyExcepction(throwErrorCode); } }catch(MyExcepction* pMyExcepction) { //输出本语句被执行信息 std::cout<<"执行了catch(MyExcepction* pMyExcepction)"<
4、 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF
5、_CRTDBG_LEAK_CHECK_DF); //可以改变错误码,以便抛出不同的异常进行测试 intthrowErrorCode=110; std::cout<<"inputtestcode:"<>throwErrorCode; try { if(throwErrorCode==110) { MyExcepctionmyStru(110); //抛出对象的地址->由catch(MyExcepction* pMyExcepction)捕获
6、 //这里该对象的地址抛出给catch语句,不会调用对象的拷贝构造函数 //传地址是提倡的做法,不会频繁地调用该对象的构造函数或拷贝构造函数 //catch语句执行结束后,myStru会被析构掉 throw &myStru; } elseif(throwErrorCode==119) { MyExcepctionmyStru(119); //抛出对象,这里会通过拷贝构造函数创建一个临时的对象传出给catch //由catch(MyExcepction myExcepction)捕获 //在catch语句中会再次调用通过拷贝构造函数创建临时对象复制这里
7、传过去的对象 //throw结束后myStru会被析构掉 throw myStru; } elseif(throwErrorCode==120) { //不提倡这样的抛出方法 //这样做的话,如果catch(MyExcepction* pMyExcepction)中不执行delete操作则会发生内存泄露 //由catch(MyExcepction* pMyExcepction)捕获 MyExcepction*pMyStru=newMyExcepction(120); throwpMyStru; } else { //直接创建新对象抛出
8、//相当于创建了临时的对象传递给了catch语句 //由catch接收时通过拷贝构造函数再次创建临时对象接收传递过去的对象 //throw结束后两次创建的临时对象会被析构掉 throwMyExcepction(throwErrorCode); } }catch(MyExcepction* pMyExcepction) { //输出本语句被执行信息 std::cout<<"执行了catch(MyExcepction* pMyExcepction)"<
此文档下载收益归作者所有