effective C++ 读书笔记 条款08
条款08 别让异常逃离析构函数:
假设在析构函数其中发生了异常,程序可能会过早结束或者导致不明白行为(异常从析构函数传播出去)
看代码:
#include <iostream>
using namespace std; class DBConnection
{
public: void close()
{
int i = 3;
int j = 0;
int k = i/j;
printf("%d\n",k);
}
}; class DBConn
{
public:
DBConn()
{ } /*
~DBConn()
{
db.close();
}
*/ //解决的方法1:强迫结束程序 ~DBConn()
{
try
{
db.close();
}
catch(...)
{
abort();//假设一个程序遭遇一个“于析构期间发生的错误”后无法继续同意,强迫结束是个合理的选择。用abort阻止异常从析构函数传播出去
}
} //解决的方法2:吞下异常
/*
~DBConn()
{
try
{
db.close();
}
catch (...)
{
//制作运转记录,记下对close的调用失败
} }
*/
private:
DBConnection db;
}; int main()
{
DBConn dbc;
//dbc对象销毁时会自己主动调用DBConnection的close函数;仅仅要调用close成功,一切美好,可是假设该调用出现异常。DBConn析构函数
//会传播该异常。也就是同意它离开这个析构函数。 会造成问题。 return 0;
} /* 採用本来的析构函数:
执行程序。提示一个程序已经停止工作(感觉这里编译器优化到解决方式1了,自己主动做了处理),假设不停止工作。也出现了不明白行为。 採用解决方式1:
执行程序,提示一个debug error,终止程序。
採用解决方式2:
执行程序,程序执行通过。可是也不会打印k的值 */
上面的解决方式1和2。都导致对close抛出的异常无法处理:
最佳办法就是DBConn自己又一次设计一个close接口,使得程序猿能够自己调用:
#include <iostream>
using namespace std; class DBConnection
{
public: void close()
{
int i = 3;
int j = 0;
int k = i/j;
printf("%d\n",k);
}
}; class DBConn
{
public:
DBConn()
{ }
~DBConn()
{
if (!closed)
{
try //关闭连接。假设客户不那么做的话
{
db.close()
}
catch(...)
{
//在这里结束程序或者吞下异常
}
} } void close()
{
db.close();
closed = true;
} private:
DBConnection db;
bool closed;
}; int main()
{
DBConn dbc;
//dbc对象销毁时会自己主动调用DBConnection的close函数;仅仅要调用close成功,一切美好,可是假设该调用出现异常,DBConn析构函数
//会传播该异常,也就是同意它离开这个析构函数。会造成问题。 return 0;
} /* 这种方法把调用close的责任从DBConn析构函数手上移动到DBConn客户手上(但DBConn析构函数仍含有一个“双保险”调用). 假设某个操作可能在失败时抛出异常。而又存在某种须要必须处理该异常,那么这个异常必须来自析构函数以外的某个函数
由于析构函数吐出异常,总会带来“过早结束程序”或者“发生不明白行为”的风险。 这里由客户自己调用close函数。假设发现异常,能够处理。 总结: 1:析构函数绝对不要吐出异常,假设一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉该异常,然后吞下它们(不传播)或结束程序
2:假设客户须要对某个操作函数执行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非析构函数)执行该操作。 */
1:析构函数绝对不要吐出异常。假设一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉该异常。然后吞下它们(不传播)或结束程序
2:假设客户须要对某个操作函数执行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非析构函数)执行该操作。
effective C++ 读书笔记 条款08的更多相关文章
- effective C++ 读书笔记 条款11
条款11: 在operator= 中处理"自我赋值" 在实现operator=时考虑自我赋值是必要的就像 x=y .我们不知道变量x与y代表的值是否为同一个值(把x和y说成是一个指 ...
- effective C++ 读书笔记 条款14 以对象管理资源
如果我们使用一个投资行为的程序库: #include "stdafx.h" #include <iostream> #include <memory> us ...
- Effective STL 读书笔记
Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...
- Effective STL读书笔记
Effective STL 读书笔记 本篇文字用于总结在阅读<Effective STL>时的笔记心得,只记录书上描写的,但自己尚未熟练掌握的知识点,不记录通用.常识类的知识点. STL按 ...
- 《Effective C++》读书笔记 条款02 尽量以const,enum,inline替换#define
Effective C++在此条款中总结出两个结论 1.对于单纯常量,最好以const对象或enum替换#define 2.对于形似函数的宏,最好改用inline函数替换#define 接下来我们进行 ...
- effective c++读书笔记(一)
很早之前就听过这本书,找工作之前读一读.看了几页,个人感觉实在是生涩难懂,非常不符合中国人的思维方式.之前也有博主做过笔记,我来补充一些自己的理解. 我看有人记了笔记,还不错:http://www.3 ...
- Effective Java读书笔记完结啦
Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...
- Effective C++读书笔记(转)
第一部分 让自己习惯C++ 条款01:视C++为一个语言联邦 一.要点 ■ c++高效编程守则视状况而变化,取决于你使用c++的哪一部分. 二.扩展 将c++视为一个由相关语言组成的联邦而非单一语言会 ...
- 【Effective C++ 读书笔记】条款02: 尽量以 const, enum, inline 替换 #define
条款02: 尽量以 const, enum, inline 替换 #define 这个条款或许可以改为“宁可以编译器替换预处理器”. 编译过程: .c文件--预处理-->.i文件--编译--&g ...
随机推荐
- CTEX windedt 打开中文tex乱码问题
% !TEX encoding = System % !TEX program = pdflatex % !TEX encoding = System% !TEX program = pdflatex ...
- CVTE笔试题
一.题目 给定一个数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法: 要求O(1)空间复杂度和O(n)的时间复杂度: ...
- Linux环境下段错误的产生原因及调试方法小结【转】
转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之 ...
- 001_shell经典案例
一. 二. -n, --numeric-sort compare according to string numerical value -k, --key=KEYDEF sort via a key ...
- 【oracle】入门学习(一)
一直想学oracle但都没有下定决心.这次借了书,一定要学好oracle. 目前学习 <Oracle从入门到精通> 明日科技 的Oracle 11g 版本 关系型数据库的基本理论 数据模型 ...
- vs 加载 dll 缓慢
https://jingyan.baidu.com/article/642c9d34e25cc2644b46f74b.html http://www.it610.com/article/2611781 ...
- 2018-2019-2 网络对抗技术 20165301 Exp4 恶意代码分析
2018-2019-2 网络对抗技术 20165301 Exp4 恶意代码分析 实验内容 系统运行监控 使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部IP是哪里.运行一段时间并分 ...
- windows下安装apache zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
- Kmeans 聚类 及其python实现
主要参考 K-means 聚类算法及 python 代码实现 还有 <机器学习实战> 这本书,当然前面那个链接的也是参考这本书,懂原理,会用就行了. 1.概述 K-means ...
- mysql 账号授权
一.移除权限 revoke all privileges on py_bond_2_1.* from pycf@"%"; flush privileges; 二.添加用户并授权 g ...