C++ 三种抛出异常方法的跟踪
2008-07-31 09:50
387 查看
记得看书上说值传递时异常会被构造三次,引用传递会被构造两次,指针传递才会只构造一次,今天试了一个,却只有值传递只被构造两次,其它两种方式只构造一次,在Cygwin和VC++ 9.0上都试了,结果一样,测试代码如下:
#include
#include
using std::cout;
using std::string;
class MyException
{
public:
MyException(const string& name, int no)
: m_name(name), m_no(no)
{
cout< }
MyException(const MyException& old)
:m_name(old.m_name), m_no(old.m_no)
{
cout< }
~MyException( void )
{
cout< }
string m_name;
int m_no;
};
int main(int argc, char* argv[])
{
try{
throw MyException("value exception",1 );
}
catch(MyException ex)
{
cout<<"caught exception:"< }
try{
throw MyException("reference exception", 2);
}
catch(MyException& ex)
{
cout<<"caught exception:"< }
try{
MyException* pe = new MyException("pointer exception", 3);
throw pe;
}
catch(MyException* pe){
cout<<"caught exception:"<m_name< delete pe;
}
}
测试结果:
还需要再证实一下。
#include
#include
using std::cout;
using std::string;
class MyException
{
public:
MyException(const string& name, int no)
: m_name(name), m_no(no)
{
cout< }
MyException(const MyException& old)
:m_name(old.m_name), m_no(old.m_no)
{
cout< }
~MyException( void )
{
cout< }
string m_name;
int m_no;
};
int main(int argc, char* argv[])
{
try{
throw MyException("value exception",1 );
}
catch(MyException ex)
{
cout<<"caught exception:"< }
try{
throw MyException("reference exception", 2);
}
catch(MyException& ex)
{
cout<<"caught exception:"< }
try{
MyException* pe = new MyException("pointer exception", 3);
throw pe;
}
catch(MyException* pe){
cout<<"caught exception:"<m_name< delete pe;
}
}
测试结果:
1:value exception : MyException::MyException( ) 1:value exception is copied caught exception:value exception 1 :MyException::~MyException( ) 1 :MyException::~MyException( ) 2:reference exception : MyException::MyException( ) caught exception:reference exception 2 :MyException::~MyException( ) 3:pointer exception : MyException::MyException( ) caught exception:pointer exception 3 :MyException::~MyException( )
还需要再证实一下。
相关文章推荐
- 确切定位c++代码中异常抛出位置的两个方法 (以VS2010调试为例)
- 确切定位c++代码中异常抛出位置的两个方法 (以VS2010调试为例)
- python中try except处理程序异常的三种常用方法
- C++ 关于 int char 以及 class 型 异常的抛出 20180315 day7
- spring事务控制的方法中抛出异常不回滚
- C++关于构造函数 和 析构函数 能否抛出异常的讨论
- C++ 多线程中的一个抛出异常
- Asp.Net : 捕捉和记录网站中出现的所有未处理错误,抛出详细的页面来源和访问ip,调用的接口方法及异常实例(记事本日志,系统日志及数据库日志)
- Mysql 时间格式默认空串 '0000-00-00 00:00:00' select抛出异常的解决方法
- 二十一天学通C++之使用throw抛出异常
- C++不能中断构造函数来拒绝产生对象(在构造和析构中抛出异常)
- Java 中子类重写父类的方法时声明抛出异常不能比父类范围大
- 读书笔记 effective c++ Item 25 实现一个不抛出异常的swap
- 关于UDP消息服务抛出“远程主机强迫关闭了一个现有的连接”的异常说明及处理方法
- 两个C++编译异常及解决方法-does not name a type和field `XX' has incomplete type
- ListView.addHeaderView抛出的异常及解决方法
- JNI调用Native方法,抛出UnsatisfiedLinkError异常
- C++异常处理:抛出异常throw,捕获异常catch(...)
- java继承并重写方法时抛出一样的异常或不抛异常,既不能多也不能少,范围既不能打也不能小
- More Effective C++ 阅读笔记(八)--“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异