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

写了一个测试c++异常处理机制的例子,感觉有很好的示范作用,在此贴出来,给c++异常处理的初学者入门。本文后附有c++异常的知识普及,有兴趣者也可以看看。
  下面的代码直接贴到你的console工程中,可以运行调试看看效果,并分析c++的异常机制。
  #include "stdafx.h"
  #include<stdlib.h>
  #include<crtdbg.h>
  #include <iostream>
  // 内存泄露检测机制
  #define _CRTDBG_MAP_ALLOC
  #ifdef _DEBUG
  #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
  #endif
  // 自定义异常类
  class MyExcepction
  {
  public:
  // 构造函数,参数为错误代码
  MyExcepction(int errorId)
  {
  // 输出构造函数被调用信息
  std::cout << "MyExcepction is called" << std::endl;
  m_errorId = errorId;
  }
  // 拷贝构造函数
  MyExcepction( MyExcepction& myExp)
  {
  // 输出拷贝构造函数被调用信息
  std::cout << "copy construct is called" << std::endl;
  this->m_errorId = myExp.m_errorId;
  }
  ~MyExcepction()
  {
  // 输出析构函数被调用信息
  std::cout << "~MyExcepction is called" << std::endl;
  }
  // 获取错误码
  int getErrorId()
  {
  return m_errorId;
  }
  private:
  // 错误码
  int m_errorId;
  };
  int main(int argc, char* argv[])
  {
  // 内存泄露检测机制
  _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
  // 可以改变错误码,以便抛出不同的异常进行测试
  int throwErrorCode = 110;
  std::cout << " input test code :" << std::endl;
  std::cin >> throwErrorCode;
  try
  {
  if ( throwErrorCode == 110)
  {
  MyExcepction myStru(110);
  // 抛出对象的地址 -> 由catch( MyExcepction*    pMyExcepction) 捕获
  // 这里该对象的地址抛出给catch语句,不会调用对象的拷贝构造函数
  // 传地址是提倡的做法,不会频繁地调用该对象的构造函数或拷贝构造函数
  // catch语句执行结束后,myStru会被析构掉
  throw    &myStru;
  }
  else if ( throwErrorCode == 119 )
  {
  MyExcepction myStru(119);
  // 抛出对象,这里会通过拷贝构造函数创建一个临时的对象传出给catch
  // 由catch( MyExcepction    myExcepction) 捕获
  // 在catch语句中会再次调用通过拷贝构造函数创建临时对象复制这里传过去的对象
  // throw结束后myStru会被析构掉
  throw    myStru;
  }
  else if ( throwErrorCode == 120 )
  {
  // 不提倡这样的抛出方法
  // 这样做的话,如果catch( MyExcepction*    pMyExcepction)中不执行delete操作则会发生内存泄露
  // 由catch( MyExcepction*    pMyExcepction) 捕获
  MyExcepction * pMyStru = new MyExcepction(120);
  throw pMyStru;
  }
  else
  {
  // 直接创建新对象抛出
  // 相当于创建了临时的对象传递给了catch语句
  // 由catch接收时通过拷贝构造函数再次创建临时对象接收传递过去的对象
  // throw结束后两次创建的临时对象会被析构掉
  throw MyExcepction(throwErrorCode);
  }
  }
  catch( MyExcepction*    pMyExcepction)
  {
  // 输出本语句被执行信息
  std::cout << "执行了 catch( MyExcepction*    pMyExcepction) " << std::endl;
  // 输出错误信息
  std::cout << "error Code : " << pMyExcepction->getErrorId()<< std::endl;
  // 异常抛出的新对象并非创建在函数栈上,而是创建在专用的异常栈上,不需要进行delete
  //delete pMyExcepction;
  }
  catch ( MyExcepction myExcepction)
  {
  // 输出本语句被执行信息
  std::cout << "执行了 catch ( MyExcepction myExcepction) " << std::endl;
  // 输出错误信息
  std::cout << "error Code : " << myExcepction.getErrorId()<< std::endl;
  }
  catch(...)
  {
  // 输出本语句被执行信息
  std::cout << "执行了 catch(...) " << std::endl;
  // 处理不了,重新抛出给上级
  throw ;
  }
  // 暂停
  int temp;
  std::cin >> temp;
  return 0;
  }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值