随笔-90  评论-947  文章-0  trackbacks-0

ScopeGuard 只是帮我们调用一个函数而已,至于这个函数是否有异常出来,它不该悄悄地把它吞了,而应该还我们本来面目,不知道是不是?可是为什么几乎所有介绍 ScopeGuard 的文章都说这 try … catch … 用得好呢?

posted on 2011-03-23 09:39 溪流 阅读(2500) 评论(6)  编辑 收藏 引用 所属分类: C++

评论:
# re: 觉得 Loki::ScopeGuard 似乎不该在它自己里面 try … catch … 2011-03-23 10:16 | expter
如果关注函数本身代码有异常,
就需要try..catch来处理了,异常发生时堆栈会unwind,而且代码看起太丑陋,就封装下咯。
Loki::ScopeGuard 轻量的RAII ,对资源管理与异常安全提供比较好,可以只关注于异常部分。  回复  更多评论
  
# re: 觉得 Loki::ScopeGuard 似乎不该在它自己里面 try … catch … 2011-03-23 10:34 | airtrack
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 | 无民事
朋友你的QQ多少?可以交流下吗?  回复  更多评论
  
# re: 觉得 Loki::ScopeGuard 似乎不该在它自己里面 try … catch … 2011-03-26 07:26 | OwnWaterloo
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 | OwnWaterloo
@溪流
恩, 我还觉得 loki.scopeguard应该区分为
1. rollback 注册的动作可取消 —— loki.scopeguard实际实现
2. on_exit 注册的动作一定执行 —— 其实这个用得不少

将 loki.scopeguard 用于 on_exit 的情况很浪费啊……
需要开辟局部变量, 需要 if 测试, 而且这个测试代码是在每一个退出点产生的……
这些开销根本不需要的。

loki应该是为了简单吧, 一顶俩……  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理