huangfu Blog
Love Leanote!
Toggle navigation
huangfu Blog
主页
About Me
归档
标签
14异常exception
2017-02-25 23:20:17
88
0
0
tarena
#异常 exception ##异常的作用 异常就是一种错误的表达形式 C语言中是通过返回值代表错误 ##C++中的默认异常错误处理 调用terminate函数`终止进程` #inlcude <iostream> using namespace std; void foo() { /* 抛出异常123*/ throw 123; } int mian() { cout << "start" << endl; foo(); /* 因foo抛出了异常,C++对异常的默认处理是终止进程,所以以下代码没有继续运行*/ cout << "end" << endl; } ##根据不同情况抛出不同异常 #include <iostream> #include <ctime> #include <cstdlib> using namespace std; void foo() { int r = rand() % 4; if(0 == r) cout << "normal" << endl; else if(1 == r) throw 1; else if(2 == r) throw 2.1; else throw "r = 3"; } int main() { srand(time(NULL)); cout << "start" << endl; foo(); cout << "end" << endl; } ##异常的捕获 try { //可能出现异常的代码 } catch(异常类型 异常变量名) { } catch(异常类型 异常变量名) { } ##举例 #include <iostream> #include <ctime> #include <cstdlib> using namespace std; void foo() { int r = rand() % 4; if(0 == r) cout << "normal" << endl; else if(1 == r) throw 1; else if(2 == r) throw 2.1; else throw "r = 3"; } int main() { srand(time(NULL)); cout << "start" << endl; /* 捕获异常*/ try { foo(); } /* 异常处理*/ catch(int e) { cout << "int exception value is " << e << endl; } catch(double e) { cout << "double exception value is " << e << endl; } catch(const char* e) { cout << "const char* exception value is " << e << endl; } cout << "end" << endl; } ##异常的说明 > void foo(); // 这个函数可能会跑出任何异常 void foo()throw(); // 这个函数不抛出任何异常,如果函数抛出了异常则无法捕获 void foo()throw(int); // 这个函数可能抛出int异常 void foo()throw(int,double); // 这个函数可能抛出int或double异常 ##子类(虚函数即函数重写)抛出的异常不能比父类更多,只能比父类更少 #include <iostream> using namespace std; class A { public: void show()throw() { } virtual void fun()throw() { } }; class B:public A { public: /* 名字隐藏没有问题,可以通过*/ void show()throw(int) { } /* 函数重写不可以子类抛出的异常比父类多*/ void fun()throw(int) { } }; int main() { B b; } ##系统定义的异常 系统定义的异常都是exception的子类 提供了一种以类的思想来表达问题 #include <iostream> #include <stdexcept> using namespace std; int main() { int *p; try { p = new int[0xfffffff]; } catch(bad_alloc& e) { cout << e.what() << endl; } catch(...) { cout << "have exception!" << endl; } string abc = "hello"; cout << abc[0] << endl; cout << abc.at(0) << endl; cout << abc[5] << endl; try { cout << abc.at(5) << endl; } catch(ou_of_range& e) { cout << e.what() << endl; } } ##用户自定义异常 1. 定义异常 用异常类把程序中的异常表达出来 比如: 网络异常 内存异常 文件异常 数据匹配异常 2. 抛出异常 根据程序中的不同的条件,抛出不同的异常 throw 异常对象;(可以抛出一个类,并用catch引用该类) 3. 捕获异常 try{ // 可能出现异常的代码 } catch(异常类型& e){ // 异常处理 } 4. 处理异常 根据不同问题,做出不同处理 ##举例 定义异常dmsException.h #ifndef DMSEXCEPTION_H #define DMSEXCEPTION_H #include <string> using namespace std; //string 在命名空间std /* 顶层异常类*/ class DmsException { string msg; public: /* 定义异常类时,一般都在头文件直接定义函数*/ DmsException(string msg):msg(msg) { } /* 访问异常信息API*/ const char* what()const throw() { return msg.c_str(); } }; /* 网络异常*/ class DmsNetWorkException:public DmsException { public: DmsNetWorkException(string msg):DmsException(msg) { } }; /* 网络初始化异常*/ class DmsInitNetWorkException:public DmsNetWorkException { public: DmsInitNetWorkException(string msg):DmsNetWorkException(msg) { } }; /* 发送数据异常*/ class DmsSendDataException:public DmsNetWorkException { public: DmsSendDataException(string msg):DmsNetWorkException(msg) { } }; #endif // DMSEXCEPTION_H 测试异常 #include <iostream> #include <ctime> #include <cstdlib> #include "dmsException.h" using namespace std; void initNetWork()throw(DmsInitNetWorkException) { int r = rand() % 3; if(0 == r) { cout << "NetWork Init Sucess" << endl; } /* 抛出网络初始化失败异常*/ else if(1 == r) { throw DmsInitNetWorkException("Init NetWork Err"); } /* 抛出服务器链接失败异常*/ else { throw DmsInitNetWorkException("Link Server Err"); } } void SendData()throw(DmsInitNetWorkException,DmsSendDataException) { /* 捕获异常*/ try { /* 初始化网络*/ InitNetWork(); } catch(DmsInitNetWorkException& e) { cout << e.what() << endl; if(/*该异常可以立即解决*/) { /* 解决异常*/ } else { /* 继续向上抛出*/ throw ; // throw e; /* 重新打包后向上抛出*/ // throw DmsInitNetWorkException("新消息"); } } int r = rand() % 2; /* 数据发送成功*/ if(0 == r) { cout << "SendData Sucess" << endl; } /* 数据发送失败*/ else { throw DmsSenDataException("SendData Err"); } } int main() { srand(time(NULL)); /* 捕获异常*/ try { /* 发送数据*/ SendData(); } /* 初始化网络失败*/ catch(DmsInitNetWorkException& e) { /* 重发*/ cout << "Reset NetWork" << endl; /* 这里重发再次条用SendData则还要进一步捕获异常*/ // SendData(); } /* 发送信息失败*/ catch(DmsSendDataException& e) { cout << e.what() << endl; } }
上一篇:
15IO流
下一篇:
13简化指针/抽象类/虚析构
0
赞
88 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册