读书频道 > 网站 > 网页设计 > C++语言导学
3.4.1 异常
15-06-23    下载编辑
收藏    我要投稿   

本文所属图书 > C++语言导学

本书作者是C++语言的设计者和最初实现者,写作本书的目的是让有经验的程序员快速了解C++现代语言。书中几乎介绍了C++语言的全部核心功能和重要的标准库组件,以很短的篇幅将C++语言的主要特性呈现给读者,并给出立即去当当网订购
让我们重新考虑Vector的例子。对2.3节中的向量,当我们试图访问某个越界的元素时,应该做什么呢?
 
Vector的作者并不知道使用者在面临这种情况时希望如何处理(通常情况下,Vector的作者甚至不知道向量被用在何种程序场景中)。
 
Vector的使用者不能保证每次都检测到问题(如果他们能做到的话,越界访问也就不会发生了)。
 
因此最佳的解决方案是由Vector的实现者负责检测可能的越界访问并通知使用者,然后Vector的使用者可以采取适当的应对措施。例如,Vector::operator[]()能够检测到潜在的越界访问错误并抛出一个out_of_range异常:

 
throw负责把程序的控制权从某个直接或间接调用了Vector::operator[]()的函数转移到out_of_range异常处理代码。为了实现这一目标,实现部分需要解开(unwind)函数调用栈以便返回主调函数的上下文。换句话说,异常处理机制把程序的控制权从当前作用域转移到处理该类型错误的代码,在必要的时候调用析构函数(见4.2.2节)。例如:

 
我们把可能发生异常的可疑程序放在一个try块当中。显然,对v[v.size()]的赋值操作将会出错。因此,程序进入到提供了out_of_range错误处理代码的catch从句中。
 
out_of_range类型定义在标准库中(在<stdexcept>中),事实上,一些标准库容器访问函数也使用它。
 
通过使用异常处理机制,错误处理变得更简单,条理性和可读性也得到了加强。但是也要注意不能过度使用try语句。4.2.2节进一步介绍一些技术——称为资源请求即初始化(Resource Aquisition Is Initialization),这些技术使得错误处理简单易用,具有较好的系统性。
 
我们可以把一个永远不会抛出异常的函数声明成noexcept。例如:

 
一旦真的发生了错误,函数user()还是会抛出异常,此时标准库函数terminate()立即终止当前程序的执行。
点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站