ScopeGuard 只是帮我们调用一个函数而已,至于这个函数是否有异常出来,它不该悄悄地把它吞了,而应该还我们本来面目,不知道是不是?可是为什么几乎所有介绍 ScopeGuard 的文章都说这 try … catch … 用得好呢?
posted on 2011-03-23 09:39
溪流 阅读(2500)
评论(6) 编辑 收藏 引用 所属分类:
C++
评论:
# re: 觉得 Loki::ScopeGuard 似乎不该在它自己里面 try … catch …
2011-03-23 10:16 |
如果关注函数本身代码有异常,
就需要try..catch来处理了,异常发生时堆栈会unwind,而且代码看起太丑陋,就封装下咯。
Loki::ScopeGuard 轻量的RAII ,对资源管理与异常安全提供比较好,可以只关注于异常部分。
回复 更多评论
# re: 觉得 Loki::ScopeGuard 似乎不该在它自己里面 try … catch …
2011-03-23 10:34 |
Loki::ScopeGuard实际上是一个通用的RAII,它是通过在ScopeGuardImplBase的所有派生类的析构函数里面SafeExecute(*this)来做到RAII,而在SafeExecute做资源释放操作是通过调用派生类的fun_,如果不try...catch,那么fun_执行如果发生异常的话,那异常就逃离了析构函数。在C++中析构函数是不应该有异常产生的,详见《Effective C++》。
回复 更多评论
# re: 觉得 Loki::ScopeGuard 似乎不该在它自己里面 try … catch …
2011-03-25 11:09 |
# re: 觉得 Loki::ScopeGuard 似乎不该在它自己里面 try … catch …
2011-03-26 07:26 |
rollback函数本身就不应该抛出异常。
异常安全的代码依赖一些无抛出的代码来执行commit或者rollback。
所以:
1. 本来面目是还不了的
rollback动作就应该无抛出的执行, 无论它本身是一个无抛出的函数, 还是被scopeguard的析构所吞掉。
2. scopeguard是否应该插手
我也认为它多管闲事了。
无抛出是rollback函数自身的责任。
没有无抛出保证就不能称为一个rollback。
应该努力将其写为rollback, 然后scopeguard仅仅考虑注册而已。
对实在没有时间与精力写为无抛出的rollback, 可自行吞掉:
rollback_nothrow(...) { rollback(...) }
makeguard(rollback_nothrow, ...)
3. loki
loki应该算是一个实验/教学性质的库吧?
所以尽可能的多传授一些C++的知识, 比如"析构绝对不能抛出异常"。
而没太注重"该保证是谁的责任"。
所以就选择一个简单且效率稍微有点低的方案了。
回复 更多评论
# re: 觉得 Loki::ScopeGuard 似乎不该在它自己里面 try … catch …
2011-03-28 14:49 |
@OwnWaterloo
你也认为它多管闲事了?!好~哈哈!
回复 更多评论
# re: 觉得 Loki::ScopeGuard 似乎不该在它自己里面 try … catch …
2011-03-28 18:45 |
@溪流
恩, 我还觉得 loki.scopeguard应该区分为
1. rollback 注册的动作可取消 —— loki.scopeguard实际实现
2. on_exit 注册的动作一定执行 —— 其实这个用得不少
将 loki.scopeguard 用于 on_exit 的情况很浪费啊……
需要开辟局部变量, 需要 if 测试, 而且这个测试代码是在每一个退出点产生的……
这些开销根本不需要的。
loki应该是为了简单吧, 一顶俩……
回复 更多评论
本博客中提供的任何源代码、非开源软件以及其他作品,如未加特别说明,均属原创。如果其中有版权说明,则请遵守版权说明;如果没有版权说明,任何人都可以将其用于任何合法场合,包括但不限于商业、非商业的。如果您有使用,特别是用于商业场合,您最好通知我一下,但这并不是必须的。本博客中的任何非原创作品,请遵守原作者的版权说明。
|
|
28 | 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
常用链接
留言簿(21)
随笔分类(124)
随笔档案(90)
我的链接
友情链接
积分与排名
最新随笔
最新评论
阅读排行榜
评论排行榜