自己的代码的异常的设计案例
2015-06-22 16:20
369 查看
#include<string>
#include<iostream>
using namespace std;
class CMyException
{
//异常类,该类的对象作为抛出异常时传递的异常参数。
public:
CMyException (string n="none") : name(n)
{
//构造函数,根据参数n构造一个名字为n的异常类对象
cout<<"构造一个CMyException对象,名称为:"<<name<<endl;
}
CMyException (const CMyException& e)
{
//拷贝构造函数,根据参数e拷贝构造一个异常类对象
name = e.name;
cout<<"拷贝一个CMyException对象,名称为:"<<name<< endl;
} virtual ~ CMyException ()
{
cout << "销毁一个CMyException对象,名称为:" <<name<< endl;
}
string GetName() {return name;}
protected:
string name; //异常类对象的名字
};
/*
void main()
{
try{
// 构造一个异常对象,即会调用一次CMyException类
//的构造函数。这是个局部变量。
CMyException obj1("obj1");
//下面抛出异常对象。注意:这时VC编译器会复制
//一份新的异常对象,即调用一次CMyException
//类的拷贝构造函数。新拷贝的对象是个临时变量。 1
throw obj1;
}
catch(CMyException e)
{
//当异常参数传递给e时,由于是传值方式,因 2
//此会调用一次拷贝构造函数
cout<<"捕获一个CMyException类型异常,名称为:"<<e.GetName()<<endl;
}
cout<<"程序运行结束!"<< endl;
}
*/
//插入例5.10中CMyException类的定义
/*
void main()
{
try{
// 构造一个异常对象,即会调用一次CMyException类
//的构造函数。这是个局部变量。
CMyException obj1("obj1");
//这里抛出异常对象。注意:这时VC编译器会复制一份新
// 的异常对象,即调用一次CMyException类的拷贝构造
//函数。新拷贝的对象是个临时变量。
throw obj1;
}
catch(CMyException &e) //按引用方式传值
{
//此处传递给e的实际是上面临时对象的引用,因此不调
//用任何构造函数。
cout<<"捕获一个CMyException类型异常,名称为:"<<e.GetName()<<endl;
}
cout<<"程序运行结束!"<< endl;
system("pause");
}
*/
/*
void main()
{
try
{
throw new CMyException ("obj1");
}
catch(CMyException* e)
{
cout<<"www"<<e->GetName()<<endl;
delete e;
}
system("pause");
}*/
//此处包含例5.10中的CMyException类代码
class CTestClass
{
//测试类,其构造函数可能抛出int型或char*型异常
public:
CTestClass(int x) throw(int);
void print();
private:
int a;
};
CTestClass:: CTestClass(int x) throw(int)
{
//可能抛出int型或char*型异常,但其本身不处理int类型异常
try
{
if(x==0)
throw 0;
if(x>1000)
throw "x值太大!";
a = 100/x;
}
catch(char* s)
{
cout<<"处理了char*类型异常信息:"<<s<<endl;
}
}
void CTestClass::print()
{
cout<<a<<endl;
}
void func8(int x) throw(CMyException, int)
{
// 可能抛出CMyException, int类型异常
CTestClass a(x);
a.print();
CMyException obj2("obj2");
throw obj2;
}
void func9() throw(char*)
{
// 可能抛出char*类型异常
char *p = new char[20];
try
{
//可能引起异常的代码
throw "error";
}
catch(...)
{
// 释放申请的空间p后将异常继续抛出
cout <<"释放申请的空间"<<endl;
delete p;
throw;
}
}
void main()
{
try
{ //可能产生异常的代码
throw new CMyException("obj1");
}
catch(CMyException *e)
{
cout<<"捕获一个CMyException类型的异常,名称为:"<<e->GetName()<<endl;
delete e;
}
try
{
cout<<"请输入一个int类型的值:";
int x=0;
cin>>x;
// func8(x);
func9();
}
catch(int x)
{
cout<<"处理了int类型的异常:"<<x<<endl;
}
catch(char *s)
{
cout<<"处理了char*类型的异常:"<<s<<endl;
}
catch(CMyException &e)
{
cout<<"处理了CMyException类型的异常:"<<e.GetName()<<endl;
}
catch(...)
{
cout<<"处理了所有类型的异常!"<<endl;
}
cout<<"程序运行结束!"<< endl;
system("pause");
}
#include<iostream>
using namespace std;
class CMyException
{
//异常类,该类的对象作为抛出异常时传递的异常参数。
public:
CMyException (string n="none") : name(n)
{
//构造函数,根据参数n构造一个名字为n的异常类对象
cout<<"构造一个CMyException对象,名称为:"<<name<<endl;
}
CMyException (const CMyException& e)
{
//拷贝构造函数,根据参数e拷贝构造一个异常类对象
name = e.name;
cout<<"拷贝一个CMyException对象,名称为:"<<name<< endl;
} virtual ~ CMyException ()
{
cout << "销毁一个CMyException对象,名称为:" <<name<< endl;
}
string GetName() {return name;}
protected:
string name; //异常类对象的名字
};
/*
void main()
{
try{
// 构造一个异常对象,即会调用一次CMyException类
//的构造函数。这是个局部变量。
CMyException obj1("obj1");
//下面抛出异常对象。注意:这时VC编译器会复制
//一份新的异常对象,即调用一次CMyException
//类的拷贝构造函数。新拷贝的对象是个临时变量。 1
throw obj1;
}
catch(CMyException e)
{
//当异常参数传递给e时,由于是传值方式,因 2
//此会调用一次拷贝构造函数
cout<<"捕获一个CMyException类型异常,名称为:"<<e.GetName()<<endl;
}
cout<<"程序运行结束!"<< endl;
}
*/
//插入例5.10中CMyException类的定义
/*
void main()
{
try{
// 构造一个异常对象,即会调用一次CMyException类
//的构造函数。这是个局部变量。
CMyException obj1("obj1");
//这里抛出异常对象。注意:这时VC编译器会复制一份新
// 的异常对象,即调用一次CMyException类的拷贝构造
//函数。新拷贝的对象是个临时变量。
throw obj1;
}
catch(CMyException &e) //按引用方式传值
{
//此处传递给e的实际是上面临时对象的引用,因此不调
//用任何构造函数。
cout<<"捕获一个CMyException类型异常,名称为:"<<e.GetName()<<endl;
}
cout<<"程序运行结束!"<< endl;
system("pause");
}
*/
/*
void main()
{
try
{
throw new CMyException ("obj1");
}
catch(CMyException* e)
{
cout<<"www"<<e->GetName()<<endl;
delete e;
}
system("pause");
}*/
//此处包含例5.10中的CMyException类代码
class CTestClass
{
//测试类,其构造函数可能抛出int型或char*型异常
public:
CTestClass(int x) throw(int);
void print();
private:
int a;
};
CTestClass:: CTestClass(int x) throw(int)
{
//可能抛出int型或char*型异常,但其本身不处理int类型异常
try
{
if(x==0)
throw 0;
if(x>1000)
throw "x值太大!";
a = 100/x;
}
catch(char* s)
{
cout<<"处理了char*类型异常信息:"<<s<<endl;
}
}
void CTestClass::print()
{
cout<<a<<endl;
}
void func8(int x) throw(CMyException, int)
{
// 可能抛出CMyException, int类型异常
CTestClass a(x);
a.print();
CMyException obj2("obj2");
throw obj2;
}
void func9() throw(char*)
{
// 可能抛出char*类型异常
char *p = new char[20];
try
{
//可能引起异常的代码
throw "error";
}
catch(...)
{
// 释放申请的空间p后将异常继续抛出
cout <<"释放申请的空间"<<endl;
delete p;
throw;
}
}
void main()
{
try
{ //可能产生异常的代码
throw new CMyException("obj1");
}
catch(CMyException *e)
{
cout<<"捕获一个CMyException类型的异常,名称为:"<<e->GetName()<<endl;
delete e;
}
try
{
cout<<"请输入一个int类型的值:";
int x=0;
cin>>x;
// func8(x);
func9();
}
catch(int x)
{
cout<<"处理了int类型的异常:"<<x<<endl;
}
catch(char *s)
{
cout<<"处理了char*类型的异常:"<<s<<endl;
}
catch(CMyException &e)
{
cout<<"处理了CMyException类型的异常:"<<e.GetName()<<endl;
}
catch(...)
{
cout<<"处理了所有类型的异常!"<<endl;
}
cout<<"程序运行结束!"<< endl;
system("pause");
}
相关文章推荐
- 空间组网相关文章更新(google scholar推送)
- flv播放器代码
- unix环境高级编程——文件i/o
- maven下载源代码,中文注释乱码的处理方法
- C#中的里氏替换原则
- Stata编程运用-运用递归函数列示文件夹内所有文件
- C++静态局部对象
- 散列表的查找代码实现
- C语言源字符集与执行字符集
- C#中as是什么含义?is是什么含义? is与as运算符
- java,数据类型
- 两个乒乓球队进行比赛,各出3人。
- PHP获取音频文件的相关信息
- 无向图 广度优先遍历 c语言实现
- struts文件上传
- matlab中的随机矩阵及其相关函数的使用
- C# DataGridView手动添加数据
- struts拦截器
- php生成PDF格式文件并且加密
- C#高级编程二十三天----实现继承