c++异常处理小结
来源:互联网 发布:淘宝旺旺买家 编辑:程序博客网 时间:2024/06/15 13:19
c++语言本身或者标准程序库跑出的所有异常,都派生自基类exception.这是其他数个标准异常的基类,他们共同构成一个类体系。
这些标准异常类别分为三组:
(1)语言本身所支持的异常
此类异常用以支撑某些语言特性。主要包括:
bad_alloc:new操作失败会抛出。
bad_cast:执行期间加在一个引用上面的动态性型别转换操作失败时抛出。
bad_typeid:执行RTTI时,交给typeid的参数为零或空指针时抛出
bad_exception:非预期的异常
(2)C++标准程序库发出的异常
总是派生自logic_error。逻辑错误是由于程序内部逻辑而导致的错误。逻辑错误是可以避免的,且在程序开始执行之前,能够被检测到。
domain_error:专业领域内的范畴 invalid_argument:无效参数,比如讲bitset以char而非0或1进行初始化 length_error:可能超越了最大极限,比如对着某个字符串附加太多字符。 out_of_range:参数不再预期范围内。例如在诸如array的容器或字符串string中采用一个错误索引。
(3)程序作用域之外发出的异常
总是派生自runtime_error,用来指出“不在程序范围内,且不容易回避”的事件。此类错误只在程序执行时才是可检测的。
举个例子:#include <iostream>#include <string>#include <bitset>#include <typeinfo>#include <vector>#include <stdexcept>using namespace std;int main(){ //logic_error:out_of_rangetry{ string str=("mirro");string rstr("saft");str.append(rstr,5,3);cout<<str<<endl;}catch(exception &e) {cerr<<"catch:"<<e.what()<<endl;cerr<<"Type:"<<typeid(e).name()<<endl;}//logic_error length_errortry{int a[10];for(int i=0;i<11;i++)a[i]=11;}catch(exception &e) {cerr<<"catch:"<<e.what()<<endl;cerr<<"Type:"<<typeid(e).name()<<endl;} //logic_error invalid_argumenttry{ bitset<32> bitset(string("11001010101100001b100101010110000"));}catch(exception &e){cerr<<"catch:"<<e.what()<<endl;cerr<<"Type:"<<typeid(e).name()<<endl;}//logic_error: domain_errortry{ throw domain_error("The domain is error");}catch(exception &e){cerr<<"catch:"<<e.what()<<endl;cerr<<"Type:"<<typeid(e).name()<<endl;}//runtime_error: range_errortry{ throw range_error("The range is error");}catch(exception &e){cerr<<"catch:"<<e.what()<<endl;cerr<<"Type:"<<typeid(e).name()<<endl;}//runtime_error: overflow_errortry{ throw overflow_error("The overflow is error");}catch(exception &e){cerr<<"catch:"<<e.what()<<endl;cerr<<"Type:"<<typeid(e).name()<<endl;}//runtime_error: underflow_errortry{ throw underflow_error("The underflow is error");}catch(exception &e){cerr<<"catch:"<<e.what()<<endl;cerr<<"Type:"<<typeid(e).name()<<endl;}return 0;}结果是:
catch:basic_string::appendType:St12out_of_rangecatch:bitset::_M_copy_from_ptrType:St16invalid_argumentcatch:The domain is errorType:St12domain_errorcatch:The range is errorType:St11range_errorcatch:The overflow is errorType:St14overflow_errorcatch:The underflow is errorType:St15underflow_error对于一些不是特定类型的错误,比如我们要自己定义错误处理。可以先定义一个基类,再重载这个基类,实现各个错误重载。
#include <iostream>#include <string>#include <stdexcept>using namespace std;class ErrorBase{public:string reason;int num;};class Exception1:public ErrorBase{public:Exception1(){ reason="exception 1";num=1;}};class Exception2:public ErrorBase{public:Exception2(){ reason="exception 2";num=2;}};void test(){ }int main(){ try{ throw Exception2();}catch(const ErrorBase& e) { cout<<e.num<<" "<<e.reason<<endl;}}本文前半部分引用自http://www.dewen.net.cn/q/8659,感谢原作者。
0 0
- c#异常处理小结
- Java异常处理小结
- java 异常处理小结
- 异常处理小结
- “异常处理”学习小结
- c++异常处理小结
- 关于DWR异常处理小结
- 关于DWR异常处理小结
- 自定义freemarker异常处理小结
- JAVA中异常处理小结
- c#中的异常处理
- 异常处理 - [C++]
- c异常处理
- Objective-c异常处理
- C语言异常处理
- c 异常处理
- C 异常处理设计
- [C++] 异常处理
- 如何判断Android多次点击事件
- 清除jquery validation插件的上一次错误提示消息
- liunx内核睡眠机制
- Expression: pSpriteFrame != 0
- Android studio下的DNK开发JNI详解流程
- c++异常处理小结
- compare与compareTo
- spring笔记——Ioc控制反转
- CodeForces 166E Tetrahedron
- git常用命令
- 检查链表是否为回文
- 复习(数据结构):栈:c语言:数组
- RedHat6.x伪分布安装Greenplum
- Android AsyncTask详细介绍