• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c++异常处理机制示例及讲解

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
c++异常处理机制示例及讲解
2009-08-14 17:26:56
标签:c++ try 异常 catch throw
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ticktick.blog.51cto.com/823160/191881

      这两天我写了一个测试c++异常处理机制的例子,感觉有很好的示范作用,在此贴出来,给c++异常处理的初学者入门。本文后附有c++异常的知识普及,有兴趣者也可以看看。

     下面的代码直接贴到你的console工程中,可以运行调试看看效果,并分析c++的异常机制。
  

  1. #include "stdafx.h"  
  2. #include<stdlib.h>  
  3. #include<crtdbg.h>  
  4. #include <iostream>  
  5. // 内存泄露检测机制  
  6. #define _CRTDBG_MAP_ALLOC   
  7. #ifdef _DEBUG  
  8. #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)  
  9. #endif  
  10.  
  11. // 自定义异常类  
  12. class MyExcepction  
  13. {  
  14. public:  
  15.  
  16.         // 构造函数,参数为错误代码  
  17.         MyExcepction(int errorId)  
  18.         {  
  19.          // 输出构造函数被调用信息  
  20.             std::cout << "MyExcepction is called" << std::endl;  
  21.             m_errorId = errorId;  
  22.         }  
  23.  
  24.         // 拷贝构造函数  
  25.         MyExcepction( MyExcepction& myExp)  
  26.         {  
  27.          // 输出拷贝构造函数被调用信息  
  28.             std::cout << "copy construct is called" << std::endl;  
  29.             this->m_errorId = myExp.m_errorId;  
  30.         }  
  31.  
  32.        ~MyExcepction()  
  33.         {  
  34.             // 输出析构函数被调用信息  
  35.             std::cout << "~MyExcepction is called" << std::endl;  
  36.         }  
  37.  
  38.        // 获取错误码  
  39.         int getErrorId()  
  40.         {  
  41.             return m_errorId;  
  42.         }  
  43.  
  44. private:      
  45.         // 错误码  
  46.         int m_errorId;  
  47. };  
  48.  
  49. int main(int argc, char* argv[])  
  50. {  
  51.         // 内存泄露检测机制  
  52.         _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );  
  53.  
  54.         // 可以改变错误码,以便抛出不同的异常进行测试  
  55.         int throwErrorCode = 110;  
  56.  
  57.        std::cout << " input test code :" << std::endl;  
  58.        std::cin >> throwErrorCode;  
  59.  
  60.        try 
  61.        {  
  62.             if ( throwErrorCode == 110)  
  63.             {  
  64.              MyExcepction myStru(110);  
  65.  
  66.                 // 抛出对象的地址 -> 由catch( MyExcepction*    pMyExcepction) 捕获  
  67.                 // 这里该对象的地址抛出给catch语句,不会调用对象的拷贝构造函数  
  68.                 // 传地址是提倡的做法,不会频繁地调用该对象的构造函数或拷贝构造函数  
  69.                 // catch语句执行结束后,myStru会被析构掉  
  70.                 throw    &myStru;      
  71.             }  
  72.             else if ( throwErrorCode == 119 )  
  73.             {  
  74.              MyExcepction myStru(119);  
  75.  
  76.                 // 抛出对象,这里会通过拷贝构造函数创建一个临时的对象传出给catch  
  77.                 // 由catch( MyExcepction    myExcepction) 捕获  
  78.                 // 在catch语句中会再次调用通过拷贝构造函数创建临时对象复制这里传过去的对象  
  79.                 // throw结束后myStru会被析构掉  
  80.                 throw    myStru;      
  81.              }  
  82.              else if ( throwErrorCode == 120 )  
  83.              {  
  84.                   // 不提倡这样的抛出方法  
  85.                   // 这样做的话,如果catch( MyExcepction*    pMyExcepction)中不执行delete操作则会发生内存泄露  
  86.  
  87.                   // 由catch( MyExcepction*    pMyExcepction) 捕获  
  88.                   MyExcepction * pMyStru = new MyExcepction(120);   
  89.                   throw pMyStru;      
  90.              }  
  91.              else 

  92. 鲜花

    握手

    雷人

    路过

    鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
c语言第一次作业发布时间:2022-07-13
下一篇:
c#命名规范,控件命名规则发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap