[C++再学习系列] 异常安全性

异常安全性

异常安全保证有 3 种:

(a) 基本保证:保证不会发生资源泄露,即使操作失败;但是状态可能发生改变。

(b) 强保证:事务提交 / 回滚语义 。即使操作失败也不会导致程序状态改变。

(c) 无失败保证:不允许失败发生。即绝对不会抛异常。

 

准则:函数应该总是支持它所能支持的最强的异常安全保证,但是前提是不能给那些并不需要该保证的调用者带来额外的开销。

准则:永远不要允许析构函数 (deconstruct) 、释放操作 (deallocation) swap() 函数抛出异常,否则的话,就没法安全且可靠地进行资源清理了。这是事务编程的基本前提,没有这些保证,无法确保事务提交和回滚不会失败。

编写异常安全代码的几条建议:

1) 使用“资源获取即初始化 (RAII ,特指 C++ 的构造和析构函数 ) ”惯用法来管理资源的所有权。如果获取失败,就释放资源,这可以防止资源泄露,还可以防止未初始化错误。

2) 使用“先在一旁将所有的事情做完,然后再通过不抛异常的操作来提交整个任务 ”的手法,避免在不确定所有操作能否成功的情况下贸然去改变对象的内部状态。这就是事务性编程,常用于保证强保证。

3) 尽量使用“单一职责的类或函数”。完成多件事情的函数是很难(无法)实现强异常保证的。比如 stack pop 具有取值和出栈两功能,由于 stack 可以用于存储对象(临时变量),而对象 ( 非内置类型 ) 的任何操作 ( 对外接口或运算重载 ) 都是可能抛异常的 ,要实现异常安全非常困难。

 

参考书:Exceptional C++, Exceptional C++ Style

 

ICE-3.7.4 最新安装文件msi文件,windows版 ICE常见报错 Exception in thread Ice.ConnectionRefusedException error = 0 at IceInternal.Network.doFinishConnect(Network.java:417) at IceInternal.TcpTransceiver.initialize(TcpTransceiver.java:33) at Ice.ConnectionI.initialize(ConnectionI.java:1536) at Ice.ConnectionI.socketReady(ConnectionI.java:1116) at Ice.ConnectionI$SocketReadyCallback.socketReady(ConnectionI.java:2299) at IceInternal.SelectorThread.run(SelectorThread.java:203) at IceInternal.SelectorThread$HelperThread.run(SelectorThread.java:273) Caused by: java.net.ConnectException: Connection refused at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:574) at IceInternal.Network.doFinishConnect(Network.java:393) ... 6 more 这种报错是ICE服务端没有起来,telnet服务端ICE的端口不通,无法建立socke 原帖地址:http://blog.youkuaiyun.com/zhenjing/archive/2009/09/10/4538705.aspx ICE常见编译和运行(异常)错误 收藏 在编译和Ice应用相关的文件中,经常因为ice相关的文件包含关系而导致编译无法通过,此时的错误一般提示和handle.h相关。然而想要解决这样的错误,一般只需要把在无法编译成.o文件的.cpp文件中和ice文件相关的头文件放在该.cpp文件的起始行即可。也就是说,根据提示,把.cpp文件中最早提示导致出错的.h文件放在起始行。 ICE的常见运行错误(异常): 1 使用的地址错误,IP并非本地IP: 发生在初始化服务器时,没办法初始化adapter. 错误信息: (IP错误) ./test: Network.cpp:475: Ice::SocketException: socket exception: Cannot assign requestedaddress 另外: 已经启动服务器后又重新启动: 发生在初始化服务器时,没办法初始化adapter. 错误信息: (port已经被使用) ./server: Network.cpp:475:Ice::SocketException: socket exception: Address already in use ///stringtoProxy对于任何string都是有效的,均可以生成相应代理,但是该代理是否有效是无法保证的. 如果代理无效,也就是说根本就没有这样的adapter或者对象,那么使用Checkcast或直接用该代理调用相应对象接口均会抛异常. 下面对每种情况加于分析. 2 使用的代理IP错误: 发生在使用代理调用接口的时候 原因: 根本就没有相应的通讯器存在. 错误信息: (使用的代理IP错误) 抛出异常: Ice::ConnectFailedException(需要几秒, 需要进行搜索) 3 使用的代理端口错误,两边不一致 : 发生在使用代理调用接口的时候 原因: 存在通讯器,但是不存在相应的对象适配器. 错误信息: 抛出异常: Ice::ConnectionRefusedException(很快, 端口没有被启用引起的,无人监听该端口) 4 使用的对象名字不正确: 发生在使用代理调用接口的时候 原因: 能够找到相应的对象适配器,但是该对象适配器中无法找到相应的对象 错误信息: 抛出异常: Ice::ObjectNotExistException(很
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值