c++异常机制
来源:互联网 发布:软件研发部门职责 编辑:程序博客网 时间:2024/05/21 07:48
c++提供异常机制,这点比C语言灵活且方便
1.引发异常
程序在出现问题的时候将引发异常,使用throw语句跳转并指出异常的相关特征
2.捕获有处理程序的异常
使用异常处理程序捕获异常,异常处理程序位于要处理问题的程序中,
catch(要响应的异常类型)//此类型于throw出的类型一致才能匹配
{
... //相关的处理
}
3.使用try块
标识其中特定的异常可能被激活的代码块,后面可跟多个catch块
try{.....throw "123";}catch(const char* s){cout << s << "被发现" << endl;exit(0);}
如果没有catch块能匹配,会默认调用abort()函数,但是可以修改这种行为
异常的类型通常为类类型,
1.这样可以使用不同的异常类型来区分出不同的异常情况
2.类对象可以携带丰富的信息
#include <iostream>using namespace std;class bad_hmean{private:int m_a, m_b;string m_s;public:bad_hmean(int a, int b, string s):m_a(a), m_b(b), m_s(s) {};void msg() {cout << m_s << endl;}};double hmean(int a, int b) throw(bad_hmean)//告诉编译器异常规范{if(a == -b)throw bad_hmean(a, b, "err a = -b");return (double)1 / (double)(a + b);}int main(){int a, b;double res;while(cin >> a >> b){cout << "a=" << a << endl<< "b=" << b << endl;try{res = hmean(a, b);}catch(bad_hmean &bh){bh.msg();continue;}cout << "res=" << res << endl;} return 0;}
异常跳转将涉及到堆栈解退
程序在throw后将释放堆栈中的内存,一直释放到try块的返回地址(应该是try块的结尾),中间压入堆栈的函数,自动变量,类对象都会被释放,类对象会调用析构函数被析构。
引发异常时编译器总是创建一个临时拷贝,即使catch的是引用。因为发生异常时原有的对象可能已经不存在了。
最好在catch中使用引用:
1.使用引用可以避免拷贝而提高效率。
2.基类的引用可以匹配所有的派生类。(如果有一组通过继承关联起来的异常类型,在异常规范中只用列出一个基类引用就可以了)
如果有一组有派生关系的异常类同时catch,其catch排列顺序于派生顺序相反:
class base1;class base2:public base;class base3:public base2;...main(){try{...}catch(base3 &b2) { /*do something*/ }catch(base2 &b1){ /*do something*/ }catch(base1 &b)//将基类放在最后匹配,使异常捕获有选择的余地 { /*do something*/ } catch(...) { /*do something*/ }}
我们使用catch(...)来捕获任何异常,这个语句一般放在最后。
未捕获异常和意外异常
意外异常:带异常规范的函数中引发的异常必须与规范列表中的某种异常匹配,否则为意外异常。
未捕获异常:异常不是在函数中引发的,则必须被捕获,没有被捕获的称未捕获异常
这2种异常默认情况下会导致程序终止。
- 【C/C++】异常机制
- C++‘异常’处理机制
- C ++ 异常机制
- Object-C异常机制
- 【C语言】异常--异常处理机制
- C语言异常机制处理
- C/C++异常处理机制
- C语言异常处理机制
- C/C++异常处理机制
- 异常处理机制(JAVA&C#)
- [转载]C语言的异常机制
- C异常处理机制:setjmp和longjmp
- C语言中的异常处理机制
- C异常处理机制:setjmp和longjmp
- C异常处理机制:setjmp和longjmp
- object-c的异常处理机制
- Objective-C语言:异常处理机制
- objective-c异常处理机制详解
- net、FTP、telnet命令和远程登录重启服务器
- jqchart 画图表
- 敏捷开发流程
- 网络\路由器 端口映射的作用
- 比较两个字符串的大小,并显示最大的字符串,如果两个字符串相同则显示第一个
- c++异常机制
- java 保留小数点方法总结
- u32 mac以及arp匹配
- 坚持
- oracle查询:取出每组中的第一条记录
- 使用4种不同的方式访问数组中的元素
- 长时间整理的xhtml网页设计规范
- android混淆使用
- 黑马程序员---迭代器Iterator的使用及其相关方法