More Effective C++ Item14:明智运用exception specifications
使用exception specifications你必须非常仔细去确保,函数调用的子函数、注册的回调函数不会违背约定。而设计模板内部的异常更难确保。
设计回调机制的时候,如果调用方规定了不抛出异常,就必须确保注册进来的函数均不会抛出异常,书上给出了这样的做法:
typedef void(*CallBackPtr)(
int eventXLocation,
int eventYLocation,
void *dataToPassBack
) throw();
并以CallBackPtr类型注册函数。SM大大自己也提到,标准不允许typedef内出现exception specifications,而这是许多编译器心照不宣的做法。
VC++的做法是这样的:VC++有这样一个extended attribute syntax叫做__declspec,声明函数时加上__declspec(nothrow)就可以有和throw()一样的效果了。MSDN上给的例子https://msdn.microsoft.com/en-us/library/49147z04.aspx:
#define WINAPI __declspec(nothrow) __stdcall
并指出对于大量声明函数很方便。
编译器并不为exception specifications负责!最多给个警告,剩下就都是运行时的事情了。
运行时抛出不在exception specifications之列的异常会调用unexpected函数,条款14推荐的做法之一是利用set_unexpected重定义unexpected,抛出一个自定的“未知异常”,并在所有的exception specifications加入这个东西。但是亲测VS2015的set_unexpected并不会正确表现。
另一个做法就是将新的unexpected函数写为直接throw;出去,这样会转而抛出std::bad_exception,再将这个列入exception specifications即可。而这样高层也许做了很多准备迎接异常也会被底层的“好意”而浪费,这需要的就是工程上的统一了。
More Effective C++ Item14:明智运用exception specifications的更多相关文章
- effective c++ 条款8 prevent exception from leaving destructor
1 析构函数绝对不要吐出异常.如果一个析构函数可能调用产生异常的函数,析构函数应该不传播该异常或结束程序 2 如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数执 ...
- 《More Effective C++ 》读书笔记(二)Exception 异常
这事篇读书笔记,只记录自己的理解和总结,一般情况不对其举例子具体说明,因为那正是书本身做的事情,我的笔记作为梳理和复习之用,划重点.我推荐学C++的人都好好读一遍Effective C++ 系列,真是 ...
- ###《More Effective C++》- 异常
More Effective C++ #@author: gr #@date: 2015-05-24 #@email: forgerui@gmail.com 九.利用destructors避免泄漏资源 ...
- C++学习书籍推荐《More Effective C++》下载
百度云及其他网盘下载地址:点我 编辑推荐 <More Effective C++:35个改善编程与设计的有效方法(中文版)>:传世经典书丛 媒体推荐 <Effective c++&g ...
- More Effective C++ 35 条款
一.基础议题(basics) 条款1:仔细区别 pointers 和 references(Distinguish between pointers and references) 一个基本的语法问题 ...
- More Effective C++笔记(二)
三.异常 条款9:利用destructor避免泄露资源 把资源封装在对象内,通常可以在exception出现时避免资源泄露 条款10:在构造函数内阻止资源泄露 C++仅仅能删除被完全构造的对象(ful ...
- c++interview
出自:https://github.com/huihut/interview Github | Docsify 简体中文 | English 关于 本仓库是面向 C/C++ 技 ...
- [C++]高效C/C ++编程tips
Effective C++ 视C++ 为一个语言联邦(C.Object-Oriented C++.Template C++.STL) 宁可以编译器替换预处理器(尽量以const.enum.inline ...
- Effective C++读书笔记(转)
第一部分 让自己习惯C++ 条款01:视C++为一个语言联邦 一.要点 ■ c++高效编程守则视状况而变化,取决于你使用c++的哪一部分. 二.扩展 将c++视为一个由相关语言组成的联邦而非单一语言会 ...
随机推荐
- "System.OutOfMemoryException" exception when you execute a query in SQL Server Management Studio (转自MSDN)
Symptoms When you use Microsoft SQL Server Management Studio (SSMS) to run an SQL query that returns ...
- SQL Server 如何设置数据库的默认初始大小和自动增长大小
我们在SQL Server中新建数据库的时候,可以选择数据库文件及日志文件的初始大小.自动增长大小和最大大小,如下图所示: 可以通过设置更改数据库初始大小.自动增长大小和最大大小: 但是其实在SQL ...
- Qt分页导航控件
最近在使用QTableWidget时,因为结果数量比较多而且又有单元格控件,为了改善效率要做分页处理.在网上找了一番,最后在http://www.cppblog.com/biao/archive/20 ...
- SA387Gr91
SA387Gr91 在DTCMS中,我做了一个SA387Gr91的网站,挺好看的.
- 【优质】React的学习资源
React的学习资源 github 地址: https://github.com/LeuisKen/react-collection https://github.com/reactnativecn/ ...
- 团队作业——Alpha冲刺2/12
团队作业--Alpha冲刺 冲刺任务安排 杨光海天 今日任务:主要学习JAVA语言,以及加入了Android开发内容的学习. 明日任务:安装Android Studio以及通过观看视频和阅读材料的形式 ...
- css固定footer到浏览器底部的方法
<html> <head></head> <body> <div class="page-wrapper"> <d ...
- python第四十四课——继承性之单继承
2.继承性 继承: 使用场景: 1).生活层面:... 2).计算机层面: 两部分组成,一部分我们称为父类(基类.超类.superclass),另一部分我们称为子类(派生类.subclass), 子类 ...
- python第三十四课——1.匿名函数的定义和使用
演示匿名函数的定义和使用 # 定义无参有返回值的有名函数: def func(): return True # 定义无参有返回值的匿名函数 f=lambda : True # 调用有名函数执行 pri ...
- [SDOI2008]洞穴勘测
嘟嘟嘟 写完lct的板儿后觉得这就是一道大水题. 连pushup都不用. 不过还是因为一个zz的错误debug了一小会儿(Link的时候连出自环--) 还有一件事就是Cut的时候判断条件还得加上,因为 ...